OSDN Git Service

PR c++/55058
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Dec 2012 05:13:22 +0000 (05:13 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Dec 2012 05:13:22 +0000 (05:13 +0000)
* pt.c (tsubst): Keep the quals when looking through a typedef.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@194289 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/typedef40.C [new file with mode: 0644]

index e150692..8a018dd 100644 (file)
@@ -1,5 +1,8 @@
 2012-12-06  Jason Merrill  <jason@redhat.com>
 
+       PR c++/55058
+       * pt.c (tsubst): Keep the quals when looking through a typedef.
+
        PR c++/55249
        * tree.c (build_vec_init_elt): Use the type of the initializer.
 
index f7c023d..c5b24b3 100644 (file)
@@ -10908,8 +10908,13 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
          return r;
        }
       else
-       /* We don't have an instantiation yet, so drop the typedef.  */
-       t = DECL_ORIGINAL_TYPE (decl);
+       {
+         /* We don't have an instantiation yet, so drop the typedef.  */
+         int quals = cp_type_quals (t);
+         t = DECL_ORIGINAL_TYPE (decl);
+         t = cp_build_qualified_type_real (t, quals,
+                                           complain | tf_ignore_bad_quals);
+       }
     }
 
   if (type
diff --git a/gcc/testsuite/g++.dg/template/typedef40.C b/gcc/testsuite/g++.dg/template/typedef40.C
new file mode 100644 (file)
index 0000000..1d8be35
--- /dev/null
@@ -0,0 +1,21 @@
+// PR c++/55058
+
+template <typename T>
+struct A { };
+
+template <typename T>
+struct B {
+  B(const A<T> T::* p);
+  typedef A<T> D;
+};
+
+template <typename T>
+B<T>::B(const D T::* p) { }
+
+struct C {
+  C() : e() {};
+
+  const A<C> e;
+};
+
+B<C> g(&C::e);