From: Paolo Carlini Date: Thu, 14 Aug 2008 19:04:05 +0000 (+0000) Subject: re PR c++/34485 (ICE with undefined type in template parameter) X-Git-Tag: releases/gcc-4.4.0~3133 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=157b0647a507b589d7651b80fe55275df54cead4;p=thirdparty%2Fgcc.git re PR c++/34485 (ICE with undefined type in template parameter) /cp 2008-08-14 Paolo Carlini PR c++/34485 * pt.c (check_template_shadow): Change to return a bool. * name-lookup.c (push_class_level_binding): Early return if check_template_shadow returns false. * cp-tree.h (check_template_shadow): Adjust declaration. /testsuite 2008-08-14 Paolo Carlini PR c++/34485 * g++.dg/template/crash81.C: New. * g++.old-deja/g++.benjamin/tem03.C: Adjust. * g++.old-deja/g++.benjamin/tem04.C: Likewise. * g++.old-deja/g++.brendan/crash7.C: Likewise. From-SVN: r139114 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 48aab06d2453..29159480da5b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2008-08-14 Paolo Carlini + + PR c++/34485 + * pt.c (check_template_shadow): Change to return a bool. + * name-lookup.c (push_class_level_binding): Early return if + check_template_shadow returns false. + * cp-tree.h (check_template_shadow): Adjust declaration. + 2008-08-14 Paolo Carlini PR c++/34600 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 4b4bf335836f..a80027ef27dd 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4450,7 +4450,7 @@ extern tree locate_dtor (tree, void *); extern bool maybe_clone_body (tree); /* in pt.c */ -extern void check_template_shadow (tree); +extern bool check_template_shadow (tree); extern tree get_innermost_template_args (tree, int); extern void maybe_begin_member_template_processing (tree); extern void maybe_end_member_template_processing (void); diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 9b456d54c575..60050b8f3393 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -2753,7 +2753,8 @@ push_class_level_binding (tree name, tree x) && TREE_TYPE (decl) == error_mark_node) decl = TREE_VALUE (decl); - check_template_shadow (decl); + if (!check_template_shadow (decl)) + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, false); /* [class.mem] diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6e4f0ba447b3..4a9e571a70aa 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2809,12 +2809,15 @@ expand_template_argument_pack (tree args) return result_args; } -/* Complain if DECL shadows a template parameter. +/* Checks if DECL shadows a template parameter. [temp.local]: A template-parameter shall not be redeclared within its - scope (including nested scopes). */ + scope (including nested scopes). -void + Emits an error and returns TRUE if the DECL shadows a parameter, + returns FALSE otherwise. */ + +bool check_template_shadow (tree decl) { tree olddecl; @@ -2822,7 +2825,7 @@ check_template_shadow (tree decl) /* If we're not in a template, we can't possibly shadow a template parameter. */ if (!current_template_parms) - return; + return true; /* Figure out what we're shadowing. */ if (TREE_CODE (decl) == OVERLOAD) @@ -2832,24 +2835,25 @@ check_template_shadow (tree decl) /* If there's no previous binding for this name, we're not shadowing anything, let alone a template parameter. */ if (!olddecl) - return; + return true; /* If we're not shadowing a template parameter, we're done. Note that OLDDECL might be an OVERLOAD (or perhaps even an ERROR_MARK), so we can't just blithely assume it to be a _DECL node. */ if (!DECL_P (olddecl) || !DECL_TEMPLATE_PARM_P (olddecl)) - return; + return true; /* We check for decl != olddecl to avoid bogus errors for using a name inside a class. We check TPFI to avoid duplicate errors for inline member templates. */ if (decl == olddecl || TEMPLATE_PARMS_FOR_INLINE (current_template_parms)) - return; + return true; error ("declaration of %q+#D", decl); error (" shadows template parm %q+#D", olddecl); + return false; } /* Return a new TEMPLATE_PARM_INDEX with the indicated INDEX, LEVEL, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1947b43aee80..9a8f5f5b8769 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-08-14 Paolo Carlini + + PR c++/34485 + * g++.dg/template/crash81.C: New. + * g++.old-deja/g++.benjamin/tem03.C: Adjust. + * g++.old-deja/g++.benjamin/tem04.C: Likewise. + * g++.old-deja/g++.brendan/crash7.C: Likewise. + 2008-08-14 Thomas Koenig PR libfortran/36886 diff --git a/gcc/testsuite/g++.dg/template/crash81.C b/gcc/testsuite/g++.dg/template/crash81.C new file mode 100644 index 000000000000..f2b76744f331 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash81.C @@ -0,0 +1,6 @@ +// PR c++/34485 + +struct A +{ + template struct X; // { dg-error "error: 'T' has not been declared|error: declaration of 'template struct A::X'|error: shadows template parm 'int X'" } +}; diff --git a/gcc/testsuite/g++.old-deja/g++.benjamin/tem03.C b/gcc/testsuite/g++.old-deja/g++.benjamin/tem03.C index 73b99659e121..8f7459f17fb4 100644 --- a/gcc/testsuite/g++.old-deja/g++.benjamin/tem03.C +++ b/gcc/testsuite/g++.old-deja/g++.benjamin/tem03.C @@ -83,7 +83,7 @@ public: template struct Xfour {// { dg-error "" } .* int T10; // { dg-error "" } .* void f(){ - char T10; + char T10; // { dg-error "error: declaration of 'char T10'" } } }; @@ -123,11 +123,11 @@ public: template friend bool fooy(U u); - template + template // { dg-error "error: declaration of 'class T161'" } friend bool foo(T161 u) { - Xseven obj; // { dg-error "" } .* - return (obj.inst == u.inst); // { dg-error "" } .* + Xseven obj; + return (obj.inst == u.inst); } }; diff --git a/gcc/testsuite/g++.old-deja/g++.benjamin/tem04.C b/gcc/testsuite/g++.old-deja/g++.benjamin/tem04.C index d486efbbaefe..7dd7462c334b 100644 --- a/gcc/testsuite/g++.old-deja/g++.benjamin/tem04.C +++ b/gcc/testsuite/g++.old-deja/g++.benjamin/tem04.C @@ -91,7 +91,7 @@ public: template class C12>// { dg-error "" } .* class Xeighteen { protected: - C12 value; // { dg-error "" } + C12 value; int C12; // { dg-error "" } .* }; diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/crash7.C b/gcc/testsuite/g++.old-deja/g++.brendan/crash7.C index 99fee519f52f..d53dee77dd32 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/crash7.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/crash7.C @@ -44,5 +44,5 @@ void Sort::sort (Vector &v)// { dg-error "" } use of bad T void f (Vector &vi) { - Sort >::sort (vi); + Sort >::sort (vi); // { dg-error "error: 'sort' is not a member of 'Sort >'" } }