DR 686 PR c++/47450
authorJason Merrill <jason@redhat.com>
Fri, 6 Jan 2012 23:19:05 +0000 (18:19 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 6 Jan 2012 23:19:05 +0000 (18:19 -0500)
DR 686
PR c++/47450
* parser.c (cp_parser_new_expression): Set
type_definition_forbidden_message.

From-SVN: r182975

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/new5.C [new file with mode: 0644]

index 041722d7179ead69408f6752dcbc4ef12b4d2da0..e31b386eedef6c3e2612afa2943b30cc2a0d522f 100644 (file)
@@ -1,5 +1,10 @@
 2012-01-06  Jason Merrill  <jason@redhat.com>
 
+       DR 686
+       PR c++/47450
+       * parser.c (cp_parser_new_expression): Set
+       type_definition_forbidden_message.
+
        PR c++/6057
        PR c++/48051
        PR c++/50855
index 0ae55a250900b89cb7e93e8de7b7c3ca1d91ffeb..9be68d0e9930a92b0a4751416d73bcac7256a3c1 100644 (file)
@@ -6668,10 +6668,17 @@ cp_parser_new_expression (cp_parser* parser)
   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
     {
       cp_token *token;
+      const char *saved_message = parser->type_definition_forbidden_message;
+
       /* Consume the `('.  */
       cp_lexer_consume_token (parser->lexer);
+
       /* Parse the type-id.  */
+      parser->type_definition_forbidden_message
+       = G_("types may not be defined in a new-expression");
       type = cp_parser_type_id (parser);
+      parser->type_definition_forbidden_message = saved_message;
+
       /* Look for the closing `)'.  */
       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
       token = cp_lexer_peek_token (parser->lexer);
index 8fc06e4c6f5d808330ddd6e846248436abc49733..cedc882385f1632c0add93a647b0bae301cfe900 100644 (file)
@@ -1,3 +1,7 @@
+2012-01-06  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/parse/new5.C: New.
+
 2012-01-06  Patrick Marlier  <patrick.marlier@gmail.com>
 
        PR testsuite/51655
diff --git a/gcc/testsuite/g++.dg/parse/new5.C b/gcc/testsuite/g++.dg/parse/new5.C
new file mode 100644 (file)
index 0000000..83937c6
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/47450
+
+struct A { };
+A* ap = new(struct: A { });    // { dg-error "types may not be defined" }