diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-08-07 14:36:39 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-08-07 14:36:39 +0000 |
commit | 3adee96c46c8f70fb52de86775c1524654f10f22 (patch) | |
tree | e9523e839afdddc29c20fdefebc1393dcbf111b9 | |
parent | 7d1496792bf96d5364e31b90656539ce3539c608 (diff) | |
download | gcc-3adee96c46c8f70fb52de86775c1524654f10f22.zip gcc-3adee96c46c8f70fb52de86775c1524654f10f22.tar.gz gcc-3adee96c46c8f70fb52de86775c1524654f10f22.tar.bz2 |
re PR c++/5767 (ICE with forwarding template template parameters)
PR c++/5767
* parser.c (cp_parser_class_name): Return immediately when scope
is error_mark_node.
* g++.dg/parse/crash11.C: New test.
From-SVN: r70226
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/crash11.C | 34 |
4 files changed, 48 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87f0107..9c89733 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-08-07 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/5767 + * parser.c (cp_parser_class_name): Return immediately when scope + is error_mark_node. + 2003-08-07 Aldy Hernandez <aldyh@redhat.com> * cp/Make-lang.in (cp/call.o): Add dependency for target.h. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index fce69ca..12f541a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10957,6 +10957,9 @@ cp_parser_class_name (cp_parser *parser, /* PARSER->SCOPE can be cleared when parsing the template-arguments to a template-id, so we save it here. */ scope = parser->scope; + if (scope == error_mark_node) + return error_mark_node; + /* Any name names a type if we're following the `typename' keyword in a qualified name where the enclosing scope is type-dependent. */ typename_p = (typename_keyword_p && scope && TYPE_P (scope) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0e039d5..9c7ea3b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-08-07 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/5767 + * g++.dg/parse/crash11.C: New test. + 2003-08-06 Alexandre Oliva <aoliva@redhat.com> * gcc.dg/cpp/spacing1.c: Update. diff --git a/gcc/testsuite/g++.dg/parse/crash11.C b/gcc/testsuite/g++.dg/parse/crash11.C new file mode 100644 index 0000000..8e6c73b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash11.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Origin: priesnit@math.uni-goettingen.de + +// PR c++/5767: ICE parsing typename with invalid scope. + +template <template <typename> class TP> +struct A +{ + template <typename T> + struct Template + { + typedef typename TP<T>::Type Type; + }; +}; +template <template <typename> class TP> +struct B +{ + template <typename T> + struct Template + { + typedef typename A<A<TP>::Template> + ::template Template<T>::Type Type; { dg-error "mismatch|class template|unqualified-id" } + }; +}; +template <typename T> +struct C +{ + typedef void Type; +}; +int main() +{ + typedef B<C>::Template<void>::Type Type; { dg-error "init-declarator|;" } +} |