OSDN Git Service

DR 686
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Jan 2012 23:19:05 +0000 (23:19 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Jan 2012 23:19:05 +0000 (23:19 +0000)
PR c++/47450
* parser.c (cp_parser_new_expression): Set
type_definition_forbidden_message.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182975 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 041722d..e31b386 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 0ae55a2..9be68d0 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 8fc06e4..cedc882 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" }