re PR c++/49823 ([C++0x] ICE on decltype(expr)::type with template)
authorJason Merrill <jason@redhat.com>
Mon, 25 Jul 2011 05:03:50 +0000 (01:03 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 25 Jul 2011 05:03:50 +0000 (01:03 -0400)
PR c++/49823
* parser.c (cp_parser_qualifying_entity): Handle templates.

From-SVN: r176732

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

index 284224f57c6c06f6bbe75d6108fa2e2cf8423783..a0f1f22bcdd614ef4dd0b58433da4b065f6f3619 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-23  Jason Merrill  <jason@redhat.com>
+
+       PR c++/49823
+       * parser.c (cp_parser_qualifying_entity): Handle templates.
+
 2011-07-22  Jason Merrill  <jason@redhat.com>
 
        PR c++/49793
index dc54dc20d800538cc3ef3049b6e5d204744504da..4e7d905627a1f8e484f9ca62d007d91bf2afcd5b 100644 (file)
@@ -4638,7 +4638,9 @@ cp_parser_qualifying_entity (cp_parser *parser,
          cp_parser_simulate_error (parser);
          return error_mark_node;
        }
-      return TYPE_NAME (scope);
+      if (TYPE_NAME (scope))
+       scope = TYPE_NAME (scope);
+      return scope;
     }
 
   /* Before we try to parse the class-name, we must save away the
index 1d0d08952c5f04d0aedb846232c80dd5e3adb90d..9eb5de6fcd56cc656e5d8d4a1dbf7a1304212233 100644 (file)
@@ -1,3 +1,7 @@
+2011-07-23  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/decltype21.C: Add 49823 examples.
+
 2011-07-22  Jason Merrill  <jason@redhat.com>
 
        PR c++/49793
index ee73bfbc36c8dbfd05575e670e683e8dd57170db..733725626c354dfacaa6c4b28826f6ad7a92bedf 100644 (file)
@@ -10,6 +10,22 @@ struct c : decltype(make<p>()) {};
 
 decltype(make<p>())::t t;
 
+// PR c++/49823
+
+template < typename T >
+auto f( const T &x )
+  -> typename decltype( x )::type; // ICE on here
+
+template < typename T >
+typename decltype( T{} )::type // ICE on here
+f( T );
+
+template < typename T >
+void f( T x )
+{ typename decltype( x )::type t; } // ICE on here
+
+// Negative tests
+
 int f();
 decltype(f())::t t2;           // { dg-error "not a class" }