PR c++/26577
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Aug 2006 06:55:03 +0000 (06:55 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Aug 2006 06:55:03 +0000 (06:55 +0000)
        * 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

gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/testsuite/g++.dg/warn/volatile1.C [new file with mode: 0644]

index f16a801..b8cc3ba 100644 (file)
@@ -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
index 902372e..710bc74 100644 (file)
@@ -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 (file)
index 0000000..5b1050f
--- /dev/null
@@ -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" }
+}