From df9ee5c8290238799b2e808b67c21aa8164b51f5 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 25 Oct 2011 13:48:10 +0000 Subject: [PATCH] re PR c++/50858 (segfault at ../../gcc/libiberty/hashtab.c:981) /cp 2011-10-25 Paolo Carlini PR c++/50858 * typeck.c (composite_pointer_type_r): Check return value of composite_pointer_type_r for error_mark_node. /testsuite 2011-10-25 Paolo Carlini PR c++/50858 * g++.dg/overload/operator5.C: New. /cp 2011-10-25 Paolo Carlini PR c++/50861 * pt.c (tsubst_copy_and_build): Check return value of tsubst_copy_and_build for error_mark_node. /testsuite 2011-10-25 Paolo Carlini PR c++/50861 * g++.dg/template/crash108.C: New. From-SVN: r180430 --- gcc/cp/ChangeLog | 12 ++++++++++++ gcc/cp/pt.c | 3 +++ gcc/cp/typeck.c | 8 ++++++-- gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/g++.dg/overload/operator5.C | 16 ++++++++++++++++ gcc/testsuite/g++.dg/template/crash108.C | 5 +++++ 6 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/overload/operator5.C create mode 100644 gcc/testsuite/g++.dg/template/crash108.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e48091f31174..58c00de43d41 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2011-10-25 Paolo Carlini + + PR c++/50858 + * typeck.c (composite_pointer_type_r): Check return value of + composite_pointer_type_r for error_mark_node. + +2011-10-25 Paolo Carlini + + PR c++/50861 + * pt.c (tsubst_copy_and_build): Check return value of + tsubst_copy_and_build for error_mark_node. + 2011-10-23 Paolo Carlini PR c++/50841 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 56fa6324ad45..79da3730502c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -13511,6 +13511,9 @@ tsubst_copy_and_build (tree t, tree unq = (tsubst_copy_and_build (function, args, complain, in_decl, true, integral_constant_expression_p)); + if (unq == error_mark_node) + return error_mark_node; + if (unq != function) { tree fn = unq; diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 749aa3f5ac97..e583faaca7da 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -510,8 +510,12 @@ composite_pointer_type_r (tree t1, tree t2, && TREE_CODE (pointee2) == POINTER_TYPE) || (TYPE_PTR_TO_MEMBER_P (pointee1) && TYPE_PTR_TO_MEMBER_P (pointee2))) - result_type = composite_pointer_type_r (pointee1, pointee2, operation, - complain); + { + result_type = composite_pointer_type_r (pointee1, pointee2, operation, + complain); + if (result_type == error_mark_node) + return error_mark_node; + } else { if (complain & tf_error) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7cf4d3f1aae0..40e1de1b6722 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2011-10-25 Paolo Carlini + + PR c++/50858 + * g++.dg/overload/operator5.C: New. + +2011-10-25 Paolo Carlini + + PR c++/50861 + * g++.dg/template/crash108.C: New. + 2011-10-25 Jakub Jelinek PR tree-optimization/50596 diff --git a/gcc/testsuite/g++.dg/overload/operator5.C b/gcc/testsuite/g++.dg/overload/operator5.C new file mode 100644 index 000000000000..574defb891b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/operator5.C @@ -0,0 +1,16 @@ +// PR c++/50858 + +class String { + typedef struct ImplicitConversionFromWTFStringToBoolDisallowedA* + (String::*UnspecifiedBoolTypeA); + typedef struct ImplicitConversionFromWTFStringToBoolDisallowedB* + (String::*UnspecifiedBoolTypeB); + operator UnspecifiedBoolTypeA() const; + operator UnspecifiedBoolTypeB() const; +}; +inline bool equalIgnoringCase(const String& a, const String& b) { } +inline bool equalPossiblyIgnoringCase(const String& a, + const String& b, + bool ignoreCase) { + return ignoreCase ? equalIgnoringCase(a, b) : (a == b); } // { dg-error "ambiguous" } +// { dg-message "note" { target *-*-* } 15 } diff --git a/gcc/testsuite/g++.dg/template/crash108.C b/gcc/testsuite/g++.dg/template/crash108.C new file mode 100644 index 000000000000..0b25fde6e380 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash108.C @@ -0,0 +1,5 @@ +// PR c++/50861 + +template struct A {A(int b=k(0));}; // { dg-error "arguments" } +void f(int k){A a;} // // { dg-error "parameter|declared" } +// { dg-message "note" { target *-*-* } 3 } -- 2.47.2