aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>2004-06-01 11:54:33 -0400
committerJason Merrill <jason@gcc.gnu.org>2004-06-01 11:54:33 -0400
commitc1d34f9050f4a44b52ae4b95a10a1a8d3b42061a (patch)
tree2c5a6e3f7c2f6957d79b50267b40c99537d58b30
parent3ff2f9d1d1316c01f2880e6408116cdc5e928ae0 (diff)
downloadgcc-c1d34f9050f4a44b52ae4b95a10a1a8d3b42061a.zip
gcc-c1d34f9050f4a44b52ae4b95a10a1a8d3b42061a.tar.gz
gcc-c1d34f9050f4a44b52ae4b95a10a1a8d3b42061a.tar.bz2
re PR c++/13092 (Accepts invalid pointer-to-member conversion)
PR c++/13092 * init.c (build_offset_ref): Build SCOPE_REF with non-null TREE_TYPE for non-dependent names. * pt.c (type_dependent_expression_p): Handle SCOPE_REF with unknown_type_node as its TREE_TYPE. * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK. * error.c (dump_decl) <SCOPE_REF case>: Use pp_expression. (dump_expr) <SCOPE_REF case>: Likewise. From-SVN: r82553
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent10.C21
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent7.C22
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent8.C22
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent9.C22
4 files changed, 87 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/template/non-dependent10.C b/gcc/testsuite/g++.dg/template/non-dependent10.C
new file mode 100644
index 0000000..369e137
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/non-dependent10.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// Two-phase name lookup for address of member:
+// Detecting error during parsing
+
+struct S
+{
+ char i;
+};
+
+template<int S::*p>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::i> x; // { dg-error "convert|no type" }
+};
diff --git a/gcc/testsuite/g++.dg/template/non-dependent7.C b/gcc/testsuite/g++.dg/template/non-dependent7.C
new file mode 100644
index 0000000..c046312
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/non-dependent7.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// Two-phase name lookup for address of member:
+// Overloading function
+
+struct S
+{
+ int f();
+ int f(int);
+};
+
+template<int (S::*p)()>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::f> x;
+};
diff --git a/gcc/testsuite/g++.dg/template/non-dependent8.C b/gcc/testsuite/g++.dg/template/non-dependent8.C
new file mode 100644
index 0000000..0adac25
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/non-dependent8.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// Two-phase name lookup for address of member:
+// Detecting overloading function error during parsing
+
+struct S
+{
+ int f(char);
+ int f(int);
+};
+
+template<int (S::*p)()>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::f> x; // { dg-error "convert|no type" }
+};
diff --git a/gcc/testsuite/g++.dg/template/non-dependent9.C b/gcc/testsuite/g++.dg/template/non-dependent9.C
new file mode 100644
index 0000000..ee34327
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/non-dependent9.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/13092: ICE taking address of member which is non-dependent
+
+struct S
+{
+ int i;
+};
+
+template<int S::*p>
+struct X
+{};
+
+template <class T>
+struct Foo
+{
+ X<&S::i> x;
+};
+
+template struct Foo<void>;