diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2008-08-14 19:04:05 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2008-08-14 19:04:05 +0000 |
commit | 157b0647a507b589d7651b80fe55275df54cead4 (patch) | |
tree | 76389064c647faca3282ba0ac417b8bb8b80faf1 | |
parent | c2b00cdcaaef76f88c770351803dcb7040338d58 (diff) | |
download | gcc-157b0647a507b589d7651b80fe55275df54cead4.zip gcc-157b0647a507b589d7651b80fe55275df54cead4.tar.gz gcc-157b0647a507b589d7651b80fe55275df54cead4.tar.bz2 |
re PR c++/34485 (ICE with undefined type in template parameter)
/cp
2008-08-14 Paolo Carlini <paolo.carlini@oracle.com>
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 <paolo.carlini@oracle.com>
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
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash81.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.benjamin/tem03.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.benjamin/tem04.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.brendan/crash7.C | 2 |
9 files changed, 42 insertions, 15 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 48aab06..2915948 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,13 @@ 2008-08-14 Paolo Carlini <paolo.carlini@oracle.com> + 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 <paolo.carlini@oracle.com> + PR c++/34600 * decl.c (grokdeclarator): In case of extern and initializer, return error_mark_node after the error. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 4b4bf33..a80027e 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 9b456d5..60050b8 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 6e4f0ba..4a9e571 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 1947b43..9a8f5f5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-08-14 Paolo Carlini <paolo.carlini@oracle.com> + + 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 <tkoenig@gcc.gnu.org> 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 0000000..f2b7674 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash81.C @@ -0,0 +1,6 @@ +// PR c++/34485 + +struct A +{ + template<T::X> struct X; // { dg-error "error: 'T' has not been declared|error: declaration of 'template<int X> 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 73b9965..8f7459f 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 <class T10, int i> 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 <class U> friend bool fooy(U u); - template <class T161> + template <class T161> // { dg-error "error: declaration of 'class T161'" } friend bool foo(T161 u) { - Xseven<T161, 5, int> obj; // { dg-error "" } .* - return (obj.inst == u.inst); // { dg-error "" } .* + Xseven<T161, 5, int> 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 d486efb..7dd7462 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 <typename T14, template <typename T15> class C12>// { dg-error "" } .* class Xeighteen { protected: - C12<T14> value; // { dg-error "" } + C12<T14> 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 99fee51..d53dee7 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<Comp>::sort (Vector<Comp::T> &v)// { dg-error "" } use of bad T void f (Vector<int> &vi) { - Sort<Comparator<int> >::sort (vi); + Sort<Comparator<int> >::sort (vi); // { dg-error "error: 'sort' is not a member of 'Sort<Comparator<int> >'" } } |