aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2004-12-09 12:33:09 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2004-12-09 12:33:09 +0000
commit354e22e18a16bca6c815347110b6fda802ce82be (patch)
tree54210854a1b232c63d07840a293b67f53a5e2e9a /gcc
parentd16b59fa0c781e599115fad750585b2c4e42c71c (diff)
downloadgcc-354e22e18a16bca6c815347110b6fda802ce82be.zip
gcc-354e22e18a16bca6c815347110b6fda802ce82be.tar.gz
gcc-354e22e18a16bca6c815347110b6fda802ce82be.tar.bz2
re PR c++/18757 (ICE (on invalid) in get_innermost_template_args)
gcc/cp/ChangeLog: PR c++/18757 * parser.c (cp_parser_template_id): Don't create a CPP_TEMPLATE_ID if parsing failed. gcc/testsuite/ChangeLog: * g++.dg/parse/typename5.C: Adjust for new error. * g++.dg/parse/typename7.C: New. From-SVN: r91935
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/typename5.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/typename7.C31
5 files changed, 46 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 202e416..696349f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2004-12-09 Alexandre Oliva <aoliva@redhat.com>
+
+ PR c++/18757
+ * parser.c (cp_parser_template_id): Don't create a CPP_TEMPLATE_ID
+ if parsing failed.
+
2004-12-09 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/18073
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index dae68f3..ce3c7a6 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -8416,8 +8416,9 @@ cp_parser_template_id (cp_parser *parser,
should we re-parse the token stream, we will not have to repeat
the effort required to do the parse, nor will we issue duplicate
error messages about problems during instantiation of the
- template. */
- if (start_of_id)
+ template. Do so only if parsing succeeded, otherwise we may
+ silently accept template arguments with syntax errors. */
+ if (start_of_id && !cp_parser_error_occurred (parser))
{
cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 54b1dfe..51d6be5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-12-09 Alexandre Oliva <aoliva@redhat.com>
+
+ * g++.dg/parse/typename5.C: Adjust for new error.
+ * g++.dg/parse/typename7.C: New.
+
2004-12-09 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/18073
diff --git a/gcc/testsuite/g++.dg/parse/typename5.C b/gcc/testsuite/g++.dg/parse/typename5.C
index 6b2ed89..3664751 100644
--- a/gcc/testsuite/g++.dg/parse/typename5.C
+++ b/gcc/testsuite/g++.dg/parse/typename5.C
@@ -8,5 +8,5 @@ template <typename> struct A {};
template <typename> struct B
{
- typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type" }
+ typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type|expected" }
};
diff --git a/gcc/testsuite/g++.dg/parse/typename7.C b/gcc/testsuite/g++.dg/parse/typename7.C
new file mode 100644
index 0000000..2119317
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename7.C
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> and
+// Alexandre Oliva <aoliva@redhat.com>
+
+// PR c++/18757: ICE in get_innermost_template_args
+
+struct A
+{
+ template<typename> void foo(int);
+ template<typename T> void bar(T t) {
+ this->foo<typename T>(t); } // { dg-error "expected" }
+ template<typename T> void bad(T t) {
+ foo<typename T>(t); } // { dg-error "expected" }
+};
+
+template <typename T>
+struct B
+{
+ void bar(T t) {
+ A().bar<typename T>(t); } // { dg-error "expected" }
+ void bad(T t) {
+ B<typename T>::bar(t); } // { dg-error "invalid|not a template" }
+};
+
+void baz()
+{
+ A().bar(0);
+ A().bad(0);
+ B<int>().bar(0);
+}