From bed02d89608838750eac5b389e91b2678c72d55d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 29 Aug 2006 02:55:03 -0400 Subject: [PATCH] re PR c++/26577 (ICE in cp_expr_size with volatile and non POD) PR c++/26577 * cvt.c (convert_to_void): Don't automatically load from volatiles of TREE_ADDRESSABLE type. From-SVN: r116554 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cvt.c | 7 +++++-- gcc/testsuite/g++.dg/warn/volatile1.C | 12 ++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/volatile1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f16a80171f2..b8cc3bab3cf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-08-28 Jason Merrill + + PR c++/26577 + * cvt.c (convert_to_void): Don't automatically load from volatiles + of TREE_ADDRESSABLE type. + 2006-08-28 Volker Reichelt PR c++/28860 diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 902372ea191..710bc74ccde 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -864,14 +864,17 @@ convert_to_void (tree expr, const char *implicit) int is_volatile = TYPE_VOLATILE (type); int is_complete = COMPLETE_TYPE_P (complete_type (type)); + /* Can't load the value if we don't know the type. */ if (is_volatile && !is_complete) warning (0, "object of incomplete type %qT will not be accessed in %s", type, implicit ? implicit : "void context"); - else if (is_reference && is_volatile) + /* Don't load the value if this is an implicit dereference, or if + the type needs to be handled by ctors/dtors. */ + else if (is_volatile && (is_reference || TREE_ADDRESSABLE (type))) warning (0, "object of type %qT will not be accessed in %s", TREE_TYPE (TREE_OPERAND (expr, 0)), implicit ? implicit : "void context"); - if (is_reference || !is_volatile || !is_complete) + if (is_reference || !is_volatile || !is_complete || TREE_ADDRESSABLE (type)) expr = TREE_OPERAND (expr, 0); break; diff --git a/gcc/testsuite/g++.dg/warn/volatile1.C b/gcc/testsuite/g++.dg/warn/volatile1.C new file mode 100644 index 00000000000..5b1050f9a1c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/volatile1.C @@ -0,0 +1,12 @@ +// PR c++/26577 + +struct A +{ + A(const A&); + A& operator=(const A&); + void baz() volatile; +}; +void A::baz() volatile +{ + *this; // { dg-warning "will not be accessed" } +} -- 2.30.2