aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/parser.c16
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/c-c++-common/raw-string-3.c32
-rw-r--r--gcc/testsuite/c-c++-common/raw-string-4.c10
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/error8.C7
-rw-r--r--gcc/testsuite/g++.dg/ext/utf-cxx98.C2
-rw-r--r--gcc/testsuite/g++.dg/ext/utf-dflt.C2
-rw-r--r--gcc/testsuite/g++.dg/ext/utf-dflt2.C1
-rw-r--r--gcc/testsuite/g++.dg/ext/utf-gnuxx98.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/error49.C6
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" }
+}