aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-29 06:55:03 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-29 06:55:03 +0000
commitdc02da7f70bd7dfc9b7dc176a1ffbe47e9c07830 (patch)
treed610e5b2cb788508832762326b280dc332edea2e
parent0e86cfce7ff7e2c27252114f9e7833c56c7c9c9c (diff)
PR c++/26577
* cvt.c (convert_to_void): Don't automatically load from volatiles of TREE_ADDRESSABLE type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116554 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cvt.c7
-rw-r--r--gcc/testsuite/g++.dg/warn/volatile1.C12
3 files changed, 23 insertions, 2 deletions
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 <jason@redhat.com>
+
+ PR c++/26577
+ * cvt.c (convert_to_void): Don't automatically load from volatiles
+ of TREE_ADDRESSABLE type.
+
2006-08-28 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
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" }
+}