re PR c++/47277 ([C++0x] pseudo destructor code that cause an internal compiler error...
authorJason Merrill <jason@redhat.com>
Sat, 28 May 2011 22:01:28 +0000 (18:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 28 May 2011 22:01:28 +0000 (18:01 -0400)
PR c++/47277
* parser.c (cp_parser_pseudo_destructor_name): Commit to parse
after we see the ~.

From-SVN: r174385

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/enum18.C

index 269e0d1e60f7b96fffc192159d189bdf80f82973..1f39aeb8355daca1a8beb19578de8ed33699c8a0 100644 (file)
@@ -1,5 +1,9 @@
 2011-05-27  Jason Merrill  <jason@redhat.com>
 
+       PR c++/47277
+       * parser.c (cp_parser_pseudo_destructor_name): Commit to parse
+       after we see the ~.
+
        * mangle.c (mangle_decl_string): Make sure we don't try to mangle
        templates.
 
index a16ba89e36465dcb696d3659819d6516c7d3a47e..75ad3f87065a35964eb3d7d31db435d4d83ca524 100644 (file)
@@ -5642,6 +5642,11 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
 
   /* Look for the `~'.  */
   cp_parser_require (parser, CPP_COMPL, RT_COMPL);
+
+  /* Once we see the ~, this has to be a pseudo-destructor.  */
+  if (!processing_template_decl && !cp_parser_error_occurred (parser))
+    cp_parser_commit_to_tentative_parse (parser);
+
   /* Look for the type-name again.  We are not responsible for
      checking that it matches the first type-name.  */
   *type = cp_parser_nonclass_name (parser);
index 36edc225434e0d25995e11f88f5e48351df02091..8e55e4b4147f979aee7c552ed6021713ef2faa10 100644 (file)
@@ -1,5 +1,7 @@
 2011-05-27  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/enum18.C: Adjust.
+
        * g++.dg/cpp0x/lambda/lambda-template2.C: New.
 
 2011-05-27  Tobias Burnus  <burnus@net-b.de>
index 5575ca6ce945b6ec7874dd7885eb199d584846a4..306ed8259f9709142b45bc22ee4b74e6cd0288a6 100644 (file)
@@ -2,7 +2,7 @@
 // { dg-options -std=c++0x }
 
 int main(void) {
-           enum e {};
-           e ev;
-           ev.e::~e_u();       // { dg-error "" }
+  enum e {};
+  e ev;
+  ev.e::~e_u();        // { dg-error "e_u. has not been declared" }
 }