aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/template/ptrmem6.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/template/ptrmem6.C')
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem6.C43
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/template/ptrmem6.C b/gcc/testsuite/g++.dg/template/ptrmem6.C
new file mode 100644
index 00000000000..1625eb9eb60
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ptrmem6.C
@@ -0,0 +1,43 @@
+// { dg-do compile }
+// Origin: <togawa at acm dot arg>
+// c++/2094: unsupported 'ptrmem_cst' in type unification
+
+struct R
+{
+ int i;
+};
+
+struct S
+{
+ int i;
+ int j;
+};
+
+struct S2 : S
+{};
+
+template<int S::*p, typename>
+struct X
+{
+ X ();
+ template<typename U> X(const X<p,U> &);
+};
+
+X<&S::i,S> x = X<&S::i,S>();
+X<&S::i,S> x2 = X<&S2::i,S>();
+X<&S::i,S> y = X<&S::j,S>(); // { dg-error "" }
+X<&S::i,S> z = X<&R::i,S>(); // { dg-error "" }
+
+template <class T>
+struct Foo
+{
+ void foo(void)
+ {
+ X<&T::i,T> x = X<&T::i,T>();
+ X<&S::i,S> x2 = X<&S2::i,S>();
+ X<&S::i,S> y = X<&S::j,S>(); // { dg-error "" }
+ X<&S::i,S> z = X<&R::i,S>(); // { dg-error "" }
+ }
+};
+
+template struct Foo<S>; // { dg-error "instantiated from" }