PR c++/49932
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Aug 2011 21:02:07 +0000 (21:02 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Aug 2011 21:02:07 +0000 (21:02 +0000)
gcc/cp/
* mangle.c (write_prefix): Handle decltype.
libiberty/
* cp-demangle.c (d_prefix): Handle decltype.

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

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 6dda726..4ce77d4 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 4a83c9a..eb3f144 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 e362644..4ff8a10 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 2c5b761..b88399e 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 f41856b..d67a9e7 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 f9e8447..3737cfd 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_