PR c++/85277 - ICE with invalid offsetof.
authorJason Merrill <jason@redhat.com>
Mon, 9 Apr 2018 20:40:06 +0000 (16:40 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 9 Apr 2018 20:40:06 +0000 (16:40 -0400)
* semantics.c (finish_offsetof): Avoid passing non-DECL to %qD.
Adjust -Winvalid-offsetof diagnostic to say conditionally supported.

From-SVN: r259254

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/g++.dg/ext/builtin-offsetof1.C
gcc/testsuite/g++.dg/other/offsetof3.C
gcc/testsuite/g++.dg/other/offsetof5.C
gcc/testsuite/g++.dg/other/offsetof8.C

index f55a240186da440a982fcc55ec478ffb768a1977..0017c34db75a66ef4f169d0491cebdfc4cee981e 100644 (file)
@@ -1,5 +1,9 @@
 2018-04-09  Jason Merrill  <jason@redhat.com>
 
+       PR c++/85277 - ICE with invalid offsetof.
+       * semantics.c (finish_offsetof): Avoid passing non-DECL to %qD.
+       Adjust -Winvalid-offsetof diagnostic to say conditionally supported.
+
        PR c++/85264 - ICE with excess template-parameter-list.
        * parser.c (cp_parser_check_template_parameters): Add template_id_p
        parameter.  Don't allow an extra template header if true.
index 59cac77f6b70a4a67e0a39cccd853cd7706c6164..8c893ed64b0098a7a262379610c37e636ac3f511 100644 (file)
@@ -4043,17 +4043,17 @@ finish_offsetof (tree object_ptr, tree expr, location_t loc)
       || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE
       || TREE_TYPE (expr) == unknown_type_node)
     {
-      if (INDIRECT_REF_P (expr))
-       error ("second operand of %<offsetof%> is neither a single "
-              "identifier nor a sequence of member accesses and "
-              "array references");
-      else
+      while (TREE_CODE (expr) == COMPONENT_REF
+            || TREE_CODE (expr) == COMPOUND_EXPR)
+       expr = TREE_OPERAND (expr, 1);
+
+      if (DECL_P (expr))
        {
-         if (TREE_CODE (expr) == COMPONENT_REF
-             || TREE_CODE (expr) == COMPOUND_EXPR)
-           expr = TREE_OPERAND (expr, 1);
          error ("cannot apply %<offsetof%> to member function %qD", expr);
+         inform (DECL_SOURCE_LOCATION (expr), "declared here");
        }
+      else
+       error ("cannot apply %<offsetof%> to member function");
       return error_mark_node;
     }
   if (TREE_CODE (expr) == CONST_DECL)
@@ -4069,9 +4069,9 @@ finish_offsetof (tree object_ptr, tree expr, location_t loc)
       && CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (object_ptr)))
       && CLASSTYPE_NON_STD_LAYOUT (TREE_TYPE (TREE_TYPE (object_ptr)))
       && cp_unevaluated_operand == 0)
-    pedwarn (loc, OPT_Winvalid_offsetof,
-            "offsetof within non-standard-layout type %qT is undefined",
-            TREE_TYPE (TREE_TYPE (object_ptr)));
+    warning_at (loc, OPT_Winvalid_offsetof, "offsetof within "
+               "non-standard-layout type %qT is conditionally-supported",
+               TREE_TYPE (TREE_TYPE (object_ptr)));
   return fold_offsetof (expr);
 }
 
index 5c5e9cf246b0abfe66aa430ef49d4aa24b145baa..cbc2daafbdd8bfc5b187ba7296ce763d8c8da596 100644 (file)
@@ -1,9 +1,11 @@
 // PR c++/51413
-// { dg-options "-w" }
+// PR c++/85277
+// { dg-options "-Wno-pointer-arith" }
 
 struct A
 {
   static void foo();
 };
 
-int i = __builtin_offsetof(A, foo[1]);  // { dg-error "neither a single identifier nor a sequence of member accesses and array references" }
+int i = __builtin_offsetof(A, foo[1]);  // { dg-error "offsetof" }
+int j = __builtin_offsetof(volatile A, foo[0]);  // { dg-error "offsetof" }
index 8d98242656041bd72c4b379a035583cb0aa20a9d..779fc72670a77e876848203c27afa127b2fdb813 100644 (file)
@@ -12,4 +12,4 @@ protected:
 typedef X* pX;
 typedef __SIZE_TYPE__ size_t;
 
-size_t yoff = __builtin_offsetof (X, y); /* { dg-error "35:non-standard-layout" } */
+size_t yoff = __builtin_offsetof (X, y); /* { dg-message "35:non-standard-layout" } */
index 86b14488246131f370b2c9d7b4d9c6a4411d4966..8514af087add8004587fff312c04561a62271ba0 100644 (file)
@@ -9,14 +9,14 @@ struct A
   int &i;
 };
 
-int j = offsetof (A, i);               // { dg-error "offsetof" }
+int j = offsetof (A, i);               // { dg-message "offsetof" }
 
 template <typename T>
 struct S
 {
   T h;
   T &i;
-  static const int j = offsetof (S, i);        // { dg-error "offsetof" }
+  static const int j = offsetof (S, i);        // { dg-message "offsetof" }
 };
 
 int k = S<int>::j;                     // { dg-message "required from here" }
index 0668199b3669c494927714d794460a65f8c49ef2..211c5127026c63e42c53995c3527201de92e5df9 100644 (file)
@@ -9,4 +9,4 @@ struct B: virtual A { };
 int a[]  = {
   !&((B*)0)->i,    // { dg-error "invalid access to non-static data member" }
   __builtin_offsetof (B, i)   // { dg-error "invalid access to non-static" }
-};                           // { dg-error "offsetof within non-standard-layout type" "" { target *-*-* } .-1 }
+};                           // { dg-message "offsetof within non-standard-layout type" "" { target *-*-* } .-1 }