re PR c++/49932 ([C++0x] ICE on instantiating decltype(expr)::type with template)
authorJason Merrill <jason@redhat.com>
Mon, 1 Aug 2011 21:02:07 +0000 (17:02 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 1 Aug 2011 21:02:07 +0000 (17:02 -0400)
PR c++/49932
gcc/cp/
* mangle.c (write_prefix): Handle decltype.
libiberty/
* cp-demangle.c (d_prefix): Handle decltype.

From-SVN: r177074

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/mangle49.C [new file with mode: 0644]
libiberty/ChangeLog
libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected

index 6dda726a1a0422abc9cbb96a8d313300a5b5c2d5..4ce77d41553204c270bfb5877cb55d950a4f16b8 100644 (file)
@@ -1,5 +1,8 @@
 2011-08-01  Jason Merrill  <jason@redhat.com>
 
+       PR c++/49932
+       * mangle.c (write_prefix): Handle decltype.
+
        PR c++/49924
        * semantics.c (cxx_eval_vec_init_1): Fix logic.
 
index 4a83c9adb2e091758df43e25496ad757b1b3e745..eb3f144b561accf6fea70f7f5ec37edd69875b93 100644 (file)
@@ -952,6 +952,7 @@ write_nested_name (const tree decl)
 /* <prefix> ::= <prefix> <unqualified-name>
            ::= <template-param>
            ::= <template-prefix> <template-args>
+           ::= <decltype>
            ::= # empty
            ::= <substitution>  */
 
@@ -968,6 +969,12 @@ write_prefix (const tree node)
 
   MANGLE_TRACE_TREE ("prefix", node);
 
+  if (TREE_CODE (node) == DECLTYPE_TYPE)
+    {
+      write_type (node);
+      return;
+    }
+
   if (find_substitution (node))
     return;
 
index e3626441401784ce15b49017d54c04c37132d483..4ff8a1010d4fced8dc9dcd59d8692544f4bfbdb3 100644 (file)
@@ -1,5 +1,8 @@
 2011-08-01  Jason Merrill  <jason@redhat.com>
 
+       PR c++/49932
+       * g++.dg/abi/mangle49.C: New.
+
        PR c++/49924
        * g++.dg/cpp0x/constexpr-array4.C: New.
 
diff --git a/gcc/testsuite/g++.dg/abi/mangle49.C b/gcc/testsuite/g++.dg/abi/mangle49.C
new file mode 100644 (file)
index 0000000..a258dc2
--- /dev/null
@@ -0,0 +1,22 @@
+// PR c++/49932
+// { dg-options "-std=c++0x -fabi-version=0" }
+
+template < typename T >
+auto
+f1( T x ) // ICE on here
+  -> typename decltype( x )::type {}
+
+template < typename T >
+typename decltype( T() )::type
+f2( T x ) {} // ICE on here
+
+struct S { typedef void type; };
+
+void g()
+{
+  f1( S() );
+  f2( S() );
+}
+
+// { dg-final { scan-assembler "_Z2f1I1SENDtfp_E4typeET_" } }
+// { dg-final { scan-assembler "_Z2f2I1SENDTcvT__EE4typeES1_" } }
index 2c5b761020c8a04423dfb85bc0ba9ffd06afc720..b88399e9e3670960918bc064698bd41407fe0693 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-01  Jason Merrill  <jason@redhat.com>
+
+       PR c++/49932
+       * cp-demangle.c (d_prefix): Handle decltype.
+       * testsuite/demangle-expected: Test it.
+
 2011-07-26  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/demangle-expected: Remove an extra line.
index f41856be6d0f922d1e3c0461163d81baea770175..d67a9e74e65471b10dd3e6b0414c79f89fbdc8ea 100644 (file)
@@ -1280,6 +1280,7 @@ d_nested_name (struct d_info *di)
 /* <prefix> ::= <prefix> <unqualified-name>
             ::= <template-prefix> <template-args>
             ::= <template-param>
+            ::= <decltype>
             ::=
             ::= <substitution>
 
@@ -1308,10 +1309,19 @@ d_prefix (struct d_info *di)
         <template-param> here.  */
 
       comb_type = DEMANGLE_COMPONENT_QUAL_NAME;
-      if (IS_DIGIT (peek)
+      if (peek == 'D')
+       {
+         char peek2 = d_peek_next_char (di);
+         if (peek2 == 'T' || peek2 == 't')
+           /* Decltype.  */
+           dc = cplus_demangle_type (di);
+         else
+           /* Destructor name.  */
+           dc = d_unqualified_name (di);
+       }
+      else if (IS_DIGIT (peek)
          || IS_LOWER (peek)
          || peek == 'C'
-         || peek == 'D'
          || peek == 'U'
          || peek == 'L')
        dc = d_unqualified_name (di);
index f9e84473c0b832b43d0de1432b61e3f90f8ec724..3737cfd7bdbc5f3390d6e2bc9719ccfeda5b732c 100644 (file)
@@ -3901,6 +3901,10 @@ java resource java/util/iso4217.properties
 --format=gnu-v3
 _Z3addIidEDTplfp_fp0_ET_T0_
 decltype ({parm#1}+{parm#2}) add<int, double>(int, double)
+# decltype scope test
+--format=gnu-v3
+_Z1fI1SENDtfp_E4typeET_
+decltype ({parm#1})::type f<S>(S)
 # decltype/fn call test
 --format=gnu-v3
 _Z4add3IidEDTclL_Z1gEfp_fp0_EET_T0_