diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-08-12 00:43:47 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-08-12 00:43:47 +0000 |
commit | 539599c198f2f5e445744221058af9d8a7f96a02 (patch) | |
tree | fd96ba601837e4bdc98384092836948628296674 /gcc | |
parent | eb3643d8009ad661b65a9deea6cb2aad7e23d41b (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/call.c | 2 | ||||
-rw-r--r-- | gcc/cp/parser.c | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/ptrmem1.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/offsetof5.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/overload3.C | 14 |
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>(); |