diff options
author | Volker Reichelt <reichelt@igpm.rwth-aachen.de> | 2006-06-12 22:56:07 +0000 |
---|---|---|
committer | Volker Reichelt <reichelt@gcc.gnu.org> | 2006-06-12 22:56:07 +0000 |
commit | 4c65a5340dac8330c4ded126bc6a8a8b717399b3 (patch) | |
tree | 1712a3d650ee1cb20144d6c58a7740745f149774 | |
parent | dfa9dde4e03150d4df95bbcfc8121b52cac401c6 (diff) | |
download | gcc-4c65a5340dac8330c4ded126bc6a8a8b717399b3.zip gcc-4c65a5340dac8330c4ded126bc6a8a8b717399b3.tar.gz gcc-4c65a5340dac8330c4ded126bc6a8a8b717399b3.tar.bz2 |
re PR c++/27601 (ICE (in fold_offsetof_1, at c-common.c:5998) on strange offsetof)
PR c++/27601
* semantics.c (finish_offsetof): Handle pseudo-destructors.
* g++.dg/ext/offsetof1.C: Add test for pseudo-destructors.
From-SVN: r114588
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/offsetof1.C | 6 |
4 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9bc9823..f64c233c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2006-06-12 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + PR c++/27601 + * semantics.c (finish_offsetof): Handle pseudo-destructors. + PR c++/27933 * name-lookup.c (lookup_qualified_name): Always return error_mark_node if lookup fails. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 8b41423..85881c0 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2887,6 +2887,12 @@ finish_typeof (tree expr) tree finish_offsetof (tree expr) { + if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR) + { + error ("cannot apply %<offsetof%> to destructor %<~%T%>", + TREE_OPERAND (expr, 2)); + return error_mark_node; + } if (TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE || TREE_CODE (TREE_TYPE (expr)) == UNKNOWN_TYPE) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9274cbd..bb887b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-06-12 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + PR c++/27601 + * g++.dg/ext/offsetof1.C: Add test for pseudo-destructors. + 2006-06-12 Mark Mitchell <mark@codesourcery.com> Kazu Hirata <kazu@codesourcery.com> diff --git a/gcc/testsuite/g++.dg/ext/offsetof1.C b/gcc/testsuite/g++.dg/ext/offsetof1.C index 0cfabf8..e59442d 100644 --- a/gcc/testsuite/g++.dg/ext/offsetof1.C +++ b/gcc/testsuite/g++.dg/ext/offsetof1.C @@ -10,3 +10,9 @@ struct bar { int a = __builtin_offsetof(bar, foo); // { dg-error "static data member" } int b = __builtin_offsetof(bar, baz); // { dg-error "member function" } int c = __builtin_offsetof(bar, ~bar); // { dg-error "member function" } + +typedef int I; +enum E { }; + +int d = __builtin_offsetof(I, ~I); // { dg-error "destructor" } +int e = __builtin_offsetof(E, ~E); // { dg-error "destructor" } |