aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-08-12 00:43:47 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-08-12 00:43:47 +0000
commit539599c198f2f5e445744221058af9d8a7f96a02 (patch)
treefd96ba601837e4bdc98384092836948628296674 /gcc
parenteb3643d8009ad661b65a9deea6cb2aad7e23d41b (diff)
downloadgcc-539599c198f2f5e445744221058af9d8a7f96a02.zip
gcc-539599c198f2f5e445744221058af9d8a7f96a02.tar.gz
gcc-539599c198f2f5e445744221058af9d8a7f96a02.tar.bz2
re PR c++/16853 (pointer-to-member initialization from incompatible one accepted)
PR c++/16853 * call.c (standard_conversion): Do not accept conversions between pointers to members if the class types are unrelated. PR c++/16618 * parser.c (cp_parser_builtin_offsetof): Cast to "const volatile char &" instead of just "char &". PR c++/16870 * pt.c (tsubst): Just return the unknown_type_node. PR c++/16853 * g++.dg/init/ptrmem1.C: New test. PR c++/16618 * g++.dg/parse/offsetof5.C: New test. PR c++/16870 * g++.dg/template/overload3.C: New test. From-SVN: r85840
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/cp/pt.c1
-rw-r--r--gcc/testsuite/ChangeLog11
-rw-r--r--gcc/testsuite/g++.dg/init/ptrmem1.C7
-rw-r--r--gcc/testsuite/g++.dg/parse/offsetof5.C13
-rw-r--r--gcc/testsuite/g++.dg/template/overload3.C14
8 files changed, 67 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d15b6fa..3fba627 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,18 @@
2004-08-11 Mark Mitchell <mark@codesourcery.com>
+ PR c++/16853
+ * call.c (standard_conversion): Do not accept conversions between
+ pointers to members if the class types are unrelated.
+
+ PR c++/16618
+ * parser.c (cp_parser_builtin_offsetof): Cast to "const volatile
+ char &" instead of just "char &".
+
+ PR c++/16870
+ * pt.c (tsubst): Just return the unknown_type_node.
+
+2004-08-11 Mark Mitchell <mark@codesourcery.com>
+
PR c++/16964
* parser.c (cp_parser_class_specifier): Robustify.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 194b339..23d65ad 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -716,6 +716,8 @@ standard_conversion (tree to, tree from, tree expr)
TYPE_PTRMEM_POINTED_TO_TYPE (from));
conv = build_conv (ck_pmem, from, conv);
}
+ else if (!same_type_p (fbase, tbase))
+ return NULL;
}
else if (IS_AGGR_TYPE (TREE_TYPE (from))
&& IS_AGGR_TYPE (TREE_TYPE (to))
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 65872c8..a8854dc 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -5859,7 +5859,12 @@ cp_parser_builtin_offsetof (cp_parser *parser)
we're just mirroring the traditional macro implementation. Better
would be to do the lowering of the ADDR_EXPR to flat pointer arithmetic
here rather than in build_x_unary_op. */
- expr = build_reinterpret_cast (build_reference_type (char_type_node), expr);
+
+ expr = (build_reinterpret_cast
+ (build_reference_type (cp_build_qualified_type
+ (char_type_node,
+ TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)),
+ expr));
expr = build_x_unary_op (ADDR_EXPR, expr);
expr = build_reinterpret_cast (size_type_node, expr);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 0574f44..516488f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -6706,6 +6706,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|| t == integer_type_node
|| t == void_type_node
|| t == char_type_node
+ || t == unknown_type_node
|| TREE_CODE (t) == NAMESPACE_DECL)
return t;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9959a9d..a721a75 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,16 @@
2004-08-11 Mark Mitchell <mark@codesourcery.com>
+ PR c++/16853
+ * g++.dg/init/ptrmem1.C: New test.
+
+ PR c++/16618
+ * g++.dg/parse/offsetof5.C: New test.
+
+ PR c++/16870
+ * g++.dg/template/overload3.C: New test.
+
+2004-08-11 Mark Mitchell <mark@codesourcery.com>
+
PR c++/16964
* g++.dg/parse/error16.C: New test.
diff --git a/gcc/testsuite/g++.dg/init/ptrmem1.C b/gcc/testsuite/g++.dg/init/ptrmem1.C
new file mode 100644
index 0000000..6f1604f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/ptrmem1.C
@@ -0,0 +1,7 @@
+// PR c++/16853
+
+struct A {};
+struct B {};
+
+int B::* b;
+int A::* a = b; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/parse/offsetof5.C b/gcc/testsuite/g++.dg/parse/offsetof5.C
new file mode 100644
index 0000000..553e33d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/offsetof5.C
@@ -0,0 +1,13 @@
+// PR c++/16618
+
+#include <stddef.h>
+
+struct test
+{
+ const char a;
+};
+
+int main()
+{
+ offsetof(test,a);
+}
diff --git a/gcc/testsuite/g++.dg/template/overload3.C b/gcc/testsuite/g++.dg/template/overload3.C
new file mode 100644
index 0000000..ec48fbb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/overload3.C
@@ -0,0 +1,14 @@
+// PR c++/16870
+
+struct A
+{
+ int operator[](int) const;
+};
+
+template<int> A foo();
+
+A bar(A(*)());
+
+template<int> int baz() { return (bar(&foo<0>))[0]; }
+
+template int baz<0>();