aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp0x
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-07-25 19:00:23 -0400
committerPatrick Palka <ppalka@redhat.com>2024-07-25 19:00:23 -0400
commit9bcad238837e2100978cd839c343c488f72e1d4a (patch)
tree5f2fa7b9a2fa19fef0113711d3942ddc337ed6f7 /gcc/testsuite/g++.dg/cpp0x
parentdafd1247b10dbf47177cb81ad267fe569baf0b97 (diff)
downloadgcc-9bcad238837e2100978cd839c343c488f72e1d4a.zip
gcc-9bcad238837e2100978cd839c343c488f72e1d4a.tar.gz
gcc-9bcad238837e2100978cd839c343c488f72e1d4a.tar.bz2
c++: alias of alias tmpl with dependent attrs [PR115897]
As a follow-up to r15-2047-g7954bb4fcb6fa8, we also need to consider dependent attributes when recursing into a non-template alias that names a dependent alias template specialization (and so STF_STRIP_DEPENDENT is set), otherwise in the first testcase below we undesirably strip B all the way to T instead of to A<T>. We also need to move the typedef recursion case of strip_typedefs up to get checked before the compound type recursion cases. Otherwise for C below (which ultimately aliases T*) we end up stripping it to T* instead of to A<T*> because the POINTER_TYPE recursion dominates the typedef recursion. It also means we issue an unexpected extra error in the third testcase below. Ideally we would also want to consider dependent attributes on non-template aliases, so that we accept the second testcase below, but making that work correctly would require broader changes to e.g. structural_comptypes. PR c++/115897 gcc/cp/ChangeLog: * tree.cc (strip_typedefs): Move up the typedef recursion case. Never strip a dependent alias template-id that has dependent attributes. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-78.C: New test. * g++.dg/cpp0x/alias-decl-79.C: New test. * g++.dg/cpp0x/alias-decl-pr92206-1a.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/alias-decl-78.C34
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/alias-decl-79.C37
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/alias-decl-pr92206-1a.C10
3 files changed, 81 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-78.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-78.C
new file mode 100644
index 0000000..a52c062
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-78.C
@@ -0,0 +1,34 @@
+// PR c++/115897
+// { dg-do compile { target c++11 } }
+
+template<class T, class U>
+struct is_same { static constexpr bool value = __is_same(T, U); };
+
+#if __cpp_variable_templates
+template<class T, class U>
+constexpr bool is_same_v = __is_same(T, U);
+#endif
+
+template<class T>
+using A [[gnu::vector_size(16)]] = T;
+
+template<class T>
+void f() {
+ using B = A<T>;
+ static_assert(!is_same<T, B>::value, "");
+#if __cpp_variable_templates
+ static_assert(!is_same_v<T, B>, "");
+#endif
+};
+
+template<class T>
+void g() {
+ using C = A<T*>;
+ static_assert(!is_same<T*, C>::value, "");
+#if __cpp_variable_templates
+ static_assert(!is_same_v<T*, C>, "");
+#endif
+};
+
+template void f<float>();
+template void g<float>();
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-79.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-79.C
new file mode 100644
index 0000000..e0f0747
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-79.C
@@ -0,0 +1,37 @@
+// PR c++/115897
+// { dg-do compile { target c++11 } }
+
+template<class T, class U>
+struct is_same { static constexpr bool value = __is_same(T, U); };
+
+#if __cpp_variable_templates
+template<class T, class U>
+constexpr bool is_same_v = __is_same(T, U);
+#endif
+
+template<class T> struct A;
+
+template<class T>
+void f() {
+ using B [[gnu::vector_size(16)]] = T;
+ static_assert(!is_same<T, B>::value, ""); // { dg-bogus "" "" { xfail *-*-* } }
+ static_assert(!is_same<A<T>, A<B>>::value, ""); // { dg-bogus "" "" { xfail *-*-* } }
+#if __cpp_variable_templates
+ static_assert(!is_same_v<T, B>, ""); // { dg-bogus "" "" { xfail c++14 } }
+ static_assert(!is_same_v<A<T>, A<B>>, ""); // { dg-bogus "" "" { xfail c++14 } }
+#endif
+};
+
+template<class T>
+void g() {
+ using C [[gnu::vector_size(16)]] = T*;
+ static_assert(!is_same<T*, C>::value, ""); // { dg-bogus "" "" { xfail *-*-* } }
+ static_assert(!is_same<A<T*>, A<C>>::value, ""); // { dg-bogus "" "" { xfail *-*-* } }
+#if __cpp_variable_templates
+ static_assert(!is_same_v<T*, C>, ""); // { dg-bogus "" "" { xfail c++14 } }
+ static_assert(!is_same_v<A<T*>, A<C>>, ""); // { dg-bogus "" "" { xfail c++14 } }
+#endif
+};
+
+template void f<float>();
+template void g<float>();
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-pr92206-1a.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-pr92206-1a.C
new file mode 100644
index 0000000..09781f6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-pr92206-1a.C
@@ -0,0 +1,10 @@
+// A version of alias-decl-pr92206-1.C where alias2 is a compound type.
+// { dg-require-effective-target c++11 }
+
+template<typename> struct A {};
+template<typename T1, typename T2 = typename T1::value> using alias1 = A<T1>;
+template<typename T> class B {
+ using alias2 = alias1<A<T>>*; // { dg-error {no type named 'value'} }
+ A<alias2> a; // { dg-bogus {no type named 'value'} }
+};
+B<int> b;