diff options
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/parser.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/raw-string-3.c | 32 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/raw-string-4.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/error8.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/utf-cxx98.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/utf-dflt.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/utf-dflt2.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/utf-gnuxx98.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error49.C | 6 |
11 files changed, 69 insertions, 33 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 98fb081..2d69a3f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,17 @@ 2012-05-17 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/39681 + * parser.c (cp_parser_new_type_id): Early return error_mark_node + if the cp_parser_type_specifier_seq call has type_specifier_seq.type + error_mark_node; tidy. + (cp_parser_new_expression): Always initialize nelts to NULL_TREE to + avoid uninitialized warnings. + (cp_parser_init_declarator, cp_parser_late_parse_one_default_arg): + Call cp_parser_skip_to_end_of_statement if cp_parser_initializer + returns error_mark_node. + +2012-05-17 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/53371 * except.c (is_admissible_throw_operand): Rename to is_admissible_throw_operand_or_catch_parameter and handle diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d18ccca..e51ab74 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -6613,7 +6613,7 @@ cp_parser_new_expression (cp_parser* parser) VEC(tree,gc) *placement; tree type; VEC(tree,gc) *initializer; - tree nelts; + tree nelts = NULL_TREE; tree ret; /* Look for the optional `::' operator. */ @@ -6666,7 +6666,6 @@ cp_parser_new_expression (cp_parser* parser) "try removing the parentheses around the type-id"); cp_parser_direct_new_declarator (parser); } - nelts = NULL_TREE; } /* Otherwise, there must be a new-type-id. */ else @@ -6736,7 +6735,6 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts) cp_declarator *declarator; cp_declarator *outer_declarator; const char *saved_message; - tree type; /* The type-specifier sequence must not contain type definitions. (It cannot contain declarations of new types either, but if they @@ -6751,6 +6749,10 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts) &type_specifier_seq); /* Restore the old message. */ parser->type_definition_forbidden_message = saved_message; + + if (type_specifier_seq.type == error_mark_node) + return error_mark_node; + /* Parse the new-declarator. */ new_declarator = cp_parser_new_declarator_opt (parser); @@ -6787,8 +6789,7 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts) new_declarator = NULL; } - type = groktypename (&type_specifier_seq, new_declarator, false); - return type; + return groktypename (&type_specifier_seq, new_declarator, false); } /* Parse an (optional) new-declarator. @@ -15735,6 +15736,8 @@ cp_parser_init_declarator (cp_parser* parser, &is_non_constant_init); if (!member_p && processing_template_decl) finish_lambda_scope (); + if (initializer == error_mark_node) + cp_parser_skip_to_end_of_statement (parser); } } @@ -21749,6 +21752,9 @@ cp_parser_late_parse_one_default_arg (cp_parser *parser, tree decl, finish_lambda_scope (); + if (parsed_arg == error_mark_node) + cp_parser_skip_to_end_of_statement (parser); + if (!processing_template_decl) { /* In a non-template class, check conversions now. In a template, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2eb3d5b..4ee1fe6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,17 @@ 2012-05-17 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/39681 + * g++.dg/parse/error48.C: New. + * g++.dg/cpp0x/error8.C: Likewise. + * g++.dg/ext/utf-cxx98.C: Adjust dg-error directive. + * g++.dg/ext/utf-dflt2.C: Likewise. + * g++.dg/ext/utf-gnuxx98.C: Likewise. + * g++.dg/ext/utf-dflt.C: Likewise. + * c-c++-common/raw-string-3.c: Likewise. + * c-c++-common/raw-string-4.c: Likewise. + +2012-05-17 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/53371 * g++.dg/cpp0x/catch1.C: New. diff --git a/gcc/testsuite/c-c++-common/raw-string-3.c b/gcc/testsuite/c-c++-common/raw-string-3.c index df9e275..70d4145 100644 --- a/gcc/testsuite/c-c++-common/raw-string-3.c +++ b/gcc/testsuite/c-c++-common/raw-string-3.c @@ -5,26 +5,26 @@ // { dg-options "-std=c++98" { target c++ } } const void *s0 = R"(a)"; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 7 } + // { dg-error "expected ',' or ';'" "" { target c } 7 } const void *s1 = uR"(a)"; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 9 } + // { dg-error "expected ',' or ';'" "" { target c } 9 } const void *s2 = UR"(a)"; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 11 } + // { dg-error "expected ',' or ';'" "" { target c } 11 } const void *s3 = u8R"(a)"; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 13 } + // { dg-error "expected ',' or ';'" "" { target c } 13 } const void *s4 = LR"(a)"; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 15 } - -const int i0 = R'a'; // { dg-error "expected ',' or ';'" } - // { dg-error "was not declared" "" { target c++ } 18 } -const int i1 = uR'a'; // { dg-error "expected ',' or ';'" } - // { dg-error "was not declared" "" { target c++ } 20 } -const int i2 = UR'a'; // { dg-error "expected ',' or ';'" } - // { dg-error "was not declared" "" { target c++ } 22 } -const int i3 = u8R'a'; // { dg-error "expected ',' or ';'" } - // { dg-error "was not declared" "" { target c++ } 24 } -const int i4 = LR'a'; // { dg-error "expected ',' or ';'" } - // { dg-error "was not declared" "" { target c++ } 26 } + // { dg-error "expected ',' or ';'" "" { target c } 15 } + +const int i0 = R'a'; // { dg-error "was not declared" "" { target c++ } } + // { dg-error "expected ',' or ';'" "" { target c } 18 } +const int i1 = uR'a'; // { dg-error "was not declared" "" { target c++ } } + // { dg-error "expected ',' or ';'" "" { target c } 20 } +const int i2 = UR'a'; // { dg-error "was not declared" "" { target c++ } } + // { dg-error "expected ',' or ';'" "" { target c } 22 } +const int i3 = u8R'a'; // { dg-error "was not declared" "" { target c++ } } + // { dg-error "expected ',' or ';'" "" { target c } 24 } +const int i4 = LR'a'; // { dg-error "was not declared" "" { target c++ } } + // { dg-error "expected ',' or ';'" "" { target c } 26 } #define R "a" #define uR "b" diff --git a/gcc/testsuite/c-c++-common/raw-string-4.c b/gcc/testsuite/c-c++-common/raw-string-4.c index 626e7f2..95825d7 100644 --- a/gcc/testsuite/c-c++-common/raw-string-4.c +++ b/gcc/testsuite/c-c++-common/raw-string-4.c @@ -4,15 +4,15 @@ // { dg-options "-std=c++0x" { target c++ } } const int i0 = R'a'; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 6 } + // { dg-error "expected ',' or ';'" "" { target c } 6 } const int i1 = uR'a'; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 8 } + // { dg-error "expected ',' or ';'" "" { target c } 8 } const int i2 = UR'a'; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 10 } + // { dg-error "expected ',' or ';'" "" { target c } 10 } const int i3 = u8R'a'; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 12 } + // { dg-error "expected ',' or ';'" "" { target c } 12 } const int i4 = LR'a'; // { dg-error "was not declared|undeclared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 14 } + // { dg-error "expected ',' or ';'" "" { target c } 14 } #define R 1 + #define uR 2 + diff --git a/gcc/testsuite/g++.dg/cpp0x/error8.C b/gcc/testsuite/g++.dg/cpp0x/error8.C new file mode 100644 index 0000000..cc4f877 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error8.C @@ -0,0 +1,7 @@ +// PR c++/39681 +// { dg-do compile { target c++11 } } + +struct A +{ + int* p = new foo; // { dg-error "16:expected type-specifier" } +}; diff --git a/gcc/testsuite/g++.dg/ext/utf-cxx98.C b/gcc/testsuite/g++.dg/ext/utf-cxx98.C index a8dd13a..365118e 100644 --- a/gcc/testsuite/g++.dg/ext/utf-cxx98.C +++ b/gcc/testsuite/g++.dg/ext/utf-cxx98.C @@ -8,9 +8,7 @@ const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */ const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */ const unsigned short c2 = u'a'; /* { dg-error "not declared" } */ - /* { dg-error "expected ',' or ';'" "" { target *-*-* } 10 } */ const unsigned long c3 = U'a'; /* { dg-error "not declared" } */ - /* { dg-error "expected ',' or ';'" "" { target *-*-* } 12 } */ #define u 1 + #define U 2 + diff --git a/gcc/testsuite/g++.dg/ext/utf-dflt.C b/gcc/testsuite/g++.dg/ext/utf-dflt.C index 04849bf..c2b127d 100644 --- a/gcc/testsuite/g++.dg/ext/utf-dflt.C +++ b/gcc/testsuite/g++.dg/ext/utf-dflt.C @@ -8,9 +8,7 @@ const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */ const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */ const unsigned short c2 = u'a'; /* { dg-error "not declared" } */ - /* { dg-error "expected ',' or ';'" "" { target *-*-* } 10 } */ const unsigned long c3 = U'a'; /* { dg-error "not declared" } */ - /* { dg-error "expected ',' or ';'" "" { target *-*-* } 12 } */ #define u 1 + #define U 2 + diff --git a/gcc/testsuite/g++.dg/ext/utf-dflt2.C b/gcc/testsuite/g++.dg/ext/utf-dflt2.C index fd2222f..ab18ef5 100644 --- a/gcc/testsuite/g++.dg/ext/utf-dflt2.C +++ b/gcc/testsuite/g++.dg/ext/utf-dflt2.C @@ -3,7 +3,6 @@ // { dg-options "-std=c++98" } const void *s0 = u8"a"; // { dg-error "was not declared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 5 } #define u8 "a" diff --git a/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C b/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C index fc8068b..b3be121 100644 --- a/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C +++ b/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C @@ -8,9 +8,7 @@ const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */ const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */ const unsigned short c2 = u'a'; /* { dg-error "not declared" } */ - /* { dg-error "expected ',' or ';'" "" { target *-*-* } 10 } */ const unsigned long c3 = U'a'; /* { dg-error "not declared" } */ - /* { dg-error "expected ',' or ';'" "" { target *-*-* } 12 } */ #define u 1 + #define U 2 + diff --git a/gcc/testsuite/g++.dg/parse/error49.C b/gcc/testsuite/g++.dg/parse/error49.C new file mode 100644 index 0000000..d5ec0c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error49.C @@ -0,0 +1,6 @@ +// PR c++/39681 + +int main() +{ + int* p = new foo; // { dg-error "16:expected type-specifier" } +} |