re PR c++/58435 (Applying a type transformation to a list: const ignored)
authorPaolo Carlini <paolo@gcc.gnu.org>
Tue, 17 Sep 2013 17:46:03 +0000 (17:46 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 17 Sep 2013 17:46:03 +0000 (17:46 +0000)
/cp
2013-09-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58435
* pt.c (tsubst, [BOUND_TEMPLATE_TEMPLATE_PARM]): Take into account
the cp_type_quals (r) too.

/testsuite
2013-09-17  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58435
* g++.dg/cpp0x/alias-decl-38.C: New.

From-SVN: r202662

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C [new file with mode: 0644]

index 5fbc78c1c2afeb81f3e7c5f1548c580f7211d58b..7e2c13beb5e6273738a2fa1bd05e53d91e3ac5e7 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/58435
+       * pt.c (tsubst, [BOUND_TEMPLATE_TEMPLATE_PARM]): Take into account
+       the cp_type_quals (r) too.
+
 2013-09-16  Adam Butcher  <adam@jessamine.co.uk>
 
        * cp-tree.h (type_uses_auto_or_concept): Declare.
@@ -11,7 +17,8 @@
        (is_auto_or_concept): New function.
        (type_uses_auto_or_concept): New function.
        * parser.h (struct cp_parser): Add fully_implicit_function_template_p.
-       * parser.c (cp_parser_new): Initialize fully_implicit_function_template_p.
+       * parser.c (cp_parser_new): Initialize
+       fully_implicit_function_template_p.
        (cp_parser_new): Initialize fully_implicit_function_template_p.
        (cp_parser_lambda_expression): Copy and restore value of
        fully_implicit_function_template_p as per other parser fields.
index c2e251aaf859cb41476c41a3716fd4c7ee46b79c..e0b71108fcf04fb5553d268c741cb1d2e1b73d95 100644 (file)
@@ -11540,7 +11540,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
                                            /*entering_scope=*/0,
                                           complain);
                return cp_build_qualified_type_real
-                 (r, cp_type_quals (t), complain);
+                 (r, cp_type_quals (t) | cp_type_quals (r), complain);
              }
            else
              /* TEMPLATE_TEMPLATE_PARM or TEMPLATE_PARM_INDEX.  */
index b36c03355cd36571b39e74ef3471ef05541125d1..205dee8b01f5db204a4e84a88cb3abb584876551 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-17  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/58435
+       * pt.c (tsubst, [BOUND_TEMPLATE_TEMPLATE_PARM]): Take into account
+       the cp_type_quals (r) too.
+
 2013-09-17  Jan Hubicka  <jh@suse.cz>
 
        PR middle-end/58332
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-38.C
new file mode 100644 (file)
index 0000000..bc98737
--- /dev/null
@@ -0,0 +1,41 @@
+// PR c++/58435
+// { dg-do compile { target c++11 } }
+
+template<typename T, typename U>
+struct same { static const bool value = false; };
+template<typename T>
+struct same<T, T> { static const bool value = true; };
+
+template <template <typename> class F, typename T> struct apply
+{ typedef F<T> type; };
+template <template <typename> class F, typename T> struct applyc
+{ typedef const F<T> type; };
+template <template <typename> class F, typename T> struct applyv
+{ typedef volatile F<T> type; };
+template <template <typename> class F, typename T> struct applycv
+{ typedef const volatile F<T> type; };
+
+template <typename T> using map = T;
+template <typename T> using mapc = const T;
+template <typename T> using mapv = volatile T;
+template <typename T> using mapcv = const volatile T;
+
+static_assert(same<apply<map, int>::type, int>::value, "");
+static_assert(same<apply<mapc, int>::type, const int>::value, "");
+static_assert(same<apply<mapv, int>::type, volatile int>::value, "");
+static_assert(same<apply<mapcv, int>::type, const volatile int>::value, "");
+
+static_assert(same<applyc<map, int>::type, const int>::value, "");
+static_assert(same<applyc<mapc, int>::type, const int>::value, "");
+static_assert(same<applyc<mapv, int>::type, const volatile int>::value, "");
+static_assert(same<applyc<mapcv, int>::type, const volatile int>::value, "");
+
+static_assert(same<applyv<map, int>::type, volatile int>::value, "");
+static_assert(same<applyv<mapc, int>::type, const volatile int>::value, "");
+static_assert(same<applyv<mapv, int>::type, volatile int>::value, "");
+static_assert(same<applyv<mapcv, int>::type, const volatile int>::value, "");
+
+static_assert(same<applycv<map, int>::type, const volatile int>::value, "");
+static_assert(same<applycv<mapc, int>::type, const volatile int>::value, "");
+static_assert(same<applycv<mapv, int>::type, const volatile int>::value, "");
+static_assert(same<applycv<mapcv, int>::type, const volatile int>::value, "");