aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-11-12 18:33:48 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2008-11-12 18:33:48 +0100
commit192657ec62c5bcda9b53987bd01444b23099be3b (patch)
tree489eff22bba1f711212b8c2896a160ef04a66e78
parent27a4e07281d191dff6b8c109b51a62d8b0731210 (diff)
downloadgcc-192657ec62c5bcda9b53987bd01444b23099be3b.zip
gcc-192657ec62c5bcda9b53987bd01444b23099be3b.tar.gz
gcc-192657ec62c5bcda9b53987bd01444b23099be3b.tar.bz2
re PR c++/34269 (Incomplete __decltype/__typeof expressions accepted)
PR c++/34269 * parser.c (cp_parser_simple_declaration): Don't commit to tentative parse if parse errors were seen. * g++.dg/cpp0x/decltype13.C: New test. * g++.dg/cpp0x/decltype-33837.C: Adjust dg-error pattern. * g++.dg/cpp0x/pr33839.C: Likewise. From-SVN: r141793
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype-33837.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype13.C38
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr33839.C2
6 files changed, 51 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8cfdf61..c19dc81 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2008-11-12 Jakub Jelinek <jakub@redhat.com>
+ PR c++/34269
+ * parser.c (cp_parser_simple_declaration): Don't commit
+ to tentative parse if parse errors were seen.
+
PR c++/35334
* error.c (dump_expr): Handle COMPLEX_EXPR.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index c819082..ec9624e 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -8179,7 +8179,8 @@ cp_parser_simple_declaration (cp_parser* parser,
(After "int (" we might be looking at a functional cast.) */
if (decl_specifiers.any_specifiers_p
&& cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN)
- && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
+ && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
+ && !cp_parser_error_occurred (parser))
cp_parser_commit_to_tentative_parse (parser);
/* Keep going until we hit the `;' at the end of the simple
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cd3752a..ab700dd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2008-11-12 Jakub Jelinek <jakub@redhat.com>
+ PR c++/34269
+ * g++.dg/cpp0x/decltype13.C: New test.
+ * g++.dg/cpp0x/decltype-33837.C: Adjust dg-error pattern.
+ * g++.dg/cpp0x/pr33839.C: Likewise.
+
PR target/35366
PR fortran/33759
* gfortran.dg/hollerith.f90: Don't assume a 32-bit value
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
index 35689fb..2c263dd 100644
--- a/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C
@@ -2,6 +2,6 @@
// PR c++/33837
void foo()
{
- __decltype (A::foo()); // { dg-error "was not declared|expected initializer" }
+ __decltype (A::foo()); // { dg-error "was not declared|expected" }
__decltype (B); // { dg-error "was not declared" }
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype13.C b/gcc/testsuite/g++.dg/cpp0x/decltype13.C
new file mode 100644
index 0000000..8e6c6d2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype13.C
@@ -0,0 +1,38 @@
+// PR c++/34269
+// { dg-do compile }
+
+void
+f1 ()
+{
+ __decltype; // { dg-error "expected" }
+}
+
+void
+f2 ()
+{
+ __decltype (; // { dg-error "expected" }
+}
+
+void
+f3 ()
+{
+ __decltype (); // { dg-error "expected" }
+}
+
+void
+f4 ()
+{
+ __typeof__; // { dg-error "expected" }
+}
+
+void
+f5 ()
+{
+ __typeof__ (; // { dg-error "expected" }
+}
+
+void
+f6 ()
+{
+ __typeof__ (); // { dg-error "expected" }
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33839.C b/gcc/testsuite/g++.dg/cpp0x/pr33839.C
index 4111d6c..0a6610a 100644
--- a/gcc/testsuite/g++.dg/cpp0x/pr33839.C
+++ b/gcc/testsuite/g++.dg/cpp0x/pr33839.C
@@ -3,6 +3,6 @@ template<int> struct A;
void foo()
{
- __decltype A<0>; // { dg-error "invalid declarator" }
+ __decltype A<0>; // { dg-error "invalid declarator|expected" }
__decltype (A<0>); // { dg-error "must be an expression" }
}