]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/26577 (ICE in cp_expr_size with volatile and non POD)
authorJason Merrill <jason@redhat.com>
Tue, 29 Aug 2006 18:15:20 +0000 (14:15 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 29 Aug 2006 18:15:20 +0000 (14:15 -0400)
        PR c++/26577
        * cvt.c (convert_to_void): Don't automatically load from volatiles
        of TREE_ADDRESSABLE type.

From-SVN: r116568

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

index c0363ef140ce34fbf6c11be5e3598e76d8a01705..b8eb591833fdea4b43c1e49bc5b8f398d1de9e61 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 455027965fdbda95b6507e934ed896d6d363cb25..0e1a8431202c96704c30ce5904ce286eafd4b2d9 100644 (file)
@@ -848,23 +848,26 @@ convert_to_void (tree expr, const char *implicit)
     
     case INDIRECT_REF:
       {
-        tree type = TREE_TYPE (expr);
-        int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
-                           == REFERENCE_TYPE;
-        int is_volatile = TYPE_VOLATILE (type);
-        int is_complete = COMPLETE_TYPE_P (complete_type (type));
-        
-        if (is_volatile && !is_complete)
-          warning ("object of incomplete type %qT will not be accessed in %s",
-                   type, implicit ? implicit : "void context");
-        else if (is_reference && is_volatile)
-          warning ("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)
-          expr = TREE_OPERAND (expr, 0);
-      
-        break;
+       tree type = TREE_TYPE (expr);
+       int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
+                          == REFERENCE_TYPE;
+       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 ("object of incomplete type %qT will not be accessed in %s",
+                  type, implicit ? implicit : "void context");
+       /* 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 ("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 || TREE_ADDRESSABLE (type))
+         expr = TREE_OPERAND (expr, 0);
+
+       break;
       }
     
     case VAR_DECL:
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" }
+}