re PR middle-end/68259 ([sso] tree checking failure in reverse_storage_order_for_comp...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 9 Nov 2015 22:40:44 +0000 (22:40 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 9 Nov 2015 22:40:44 +0000 (22:40 +0000)
PR middle-end/68259
* tree.h (reverse_storage_order_for_component_p) <COMPONENT_REF>:
Check that the type of the first operand is an aggregate type.

From-SVN: r230056

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ubsan/pr68259.C [new file with mode: 0644]
gcc/tree.h

index 1f513ecdab6c7dd8892ed421e034f0fd76ccae3e..3c764de4a89b81c2d68074e873b2f1bf6baccf8c 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/68259
+       * tree.h (reverse_storage_order_for_component_p) <COMPONENT_REF>:
+       Check that the type of the first operand is an aggregate type.
+
 2015-11-09  Nathan Sidwell  <nathan@codesourcery.com>
 
        * omp-low.c: Fix some OpenACC comment typos.
index 37ce460ebcd97733720442d8bd6017da151d2688..d5942e49f96e47fc2ce2b402171eaf9fbaafed62 100644 (file)
@@ -1,3 +1,7 @@
+2015-11-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * g++.dg/ubsan/pr68259.C: New test.
+
 2015-11-09  Uros Bizjak  <ubizjak@gmail.com>
 
        * g++.dg/cilk-plus/CK/pr66326.cc: Do not include cilk.h.
diff --git a/gcc/testsuite/g++.dg/ubsan/pr68259.C b/gcc/testsuite/g++.dg/ubsan/pr68259.C
new file mode 100644 (file)
index 0000000..5137edd
--- /dev/null
@@ -0,0 +1,54 @@
+// PR middle-end/68259\r
+\r
+// { dg-do compile }\r
+// { dg-options "-fsanitize=undefined -w" }\r
+\r
+namespace std {\r
+  template < typename _Tp > class allocator { };\r
+    template < typename _Tp, typename _Alloc\r
+= std::allocator < _Tp >\r
+>class vector {\r
+  public:\r
+typedef _Tp value_type;\r
+    void push_back (const value_type & __x) { }\r
+  };\r
+}\r
+class Foo;\r
+class FooBar {\r
+public:\r
+Foo * primitive_context;\r
+  FooBar () { }\r
+  FooBar (const FooBar & pnhp);\r
+};\r
+template < class KEY, class CONTENT > class AVLTreeNode { };\r
+template < class KEY, class CONTENT > class FooTree final\r
+{\r
+  FooBar insertPrimitive ();\r
+public:\r
+AVLTreeNode < KEY, CONTENT > *seek_no_lock (const KEY & key) { }\r
+  void primitive_patterns ( std::vector < FooBar > &patterns);\r
+};\r
+template < class KEY, class CONTENT > void FooTree < KEY,\r
+  CONTENT >::primitive_patterns ( std::vector <FooBar > &patterns)\r
+{\r
+    patterns.push_back (insertPrimitive());\r
+}\r
+template < class KEY, class CONTENT >\r
+FooBar FooTree < KEY, CONTENT >::insertPrimitive ()\r
+{\r
+  FooBar place;\r
+  seek_no_lock (place.primitive_context);\r
+  return place;\r
+}\r
+class ManuverResults { };\r
+class opc_info_t\r
+{\r
+public:\r
+FooTree < Foo *, ManuverResults > *primitivecache;\r
+};\r
+static void\r
+do_optical_prox_corr_tsafe (opc_info_t * opc_info)\r
+{\r
+  std::vector < FooBar > patterns;\r
+  opc_info->primitivecache->primitive_patterns (patterns);\r
+}\r
index 2a5ccfc6802477c39a2a7e14d77db283a5990f6d..1bb59f2ac8c0ab7e0c6bb611368be2cf49bba0d8 100644 (file)
@@ -4387,8 +4387,9 @@ reverse_storage_order_for_component_p (tree t)
     {
     case ARRAY_REF:
     case COMPONENT_REF:
-      /* ??? Fortran can take COMPONENT_REF of a void type.  */
-      return !VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
+      /* ??? Fortran can take COMPONENT_REF of a VOID_TYPE.  */
+      /* ??? UBSan can take COMPONENT_REF of a REFERENCE_TYPE.  */
+      return AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))
             && TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (TREE_OPERAND (t, 0)));
 
     case BIT_FIELD_REF: