]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/59633 (ICE with __attribute((vector_size(...))) for enum)
authorJason Merrill <jason@redhat.com>
Thu, 30 Jan 2014 14:21:31 +0000 (09:21 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 30 Jan 2014 14:21:31 +0000 (09:21 -0500)
PR c++/59633
gcc/
* tree.c (walk_type_fields): Handle VECTOR_TYPE.
gcc/cp/
* decl2.c (attributes_naming_typedef_ok): New.
* cp-tree.h: Declare it.
* decl.c (grokdeclarator): Check it.
* tree.c (no_linkage_check): Handle VECTOR_TYPE.

From-SVN: r207302

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/tree.c
gcc/testsuite/g++.dg/ext/vector26.C [new file with mode: 0644]
gcc/tree.c

index e259b5730ed1c6137aafd431b2459ea4410e6213..d571a8faf440ec64a72d81a81c370bb4b03484a1 100644 (file)
@@ -1,5 +1,8 @@
 2014-01-30  Jason Merrill  <jason@redhat.com>
 
+       PR c++/59633
+       * tree.c (walk_type_fields): Handle VECTOR_TYPE.
+
        PR c++/59645
        * cgraphunit.c (expand_thunk): Copy volatile arg to a temporary.
 
index 59f2b7ec91d585cc992c021ac4ec0bc3ac6fa355..037b4bd8c409f4f27b1c62f0eefa6f7fd102ae11 100644 (file)
@@ -1,3 +1,11 @@
+2014-01-30  Jason Merrill  <jason@redhat.com>
+
+       PR c++/59633
+       * decl2.c (attributes_naming_typedef_ok): New.
+       * cp-tree.h: Declare it.
+       * decl.c (grokdeclarator): Check it.
+       * tree.c (no_linkage_check): Handle VECTOR_TYPE.
+
 2014-01-29  Jason Merrill  <jason@redhat.com>
 
        PR c++/59707
index ab75db837abafbd31052ec6ee15dc7b6aa125da8..7f4649903fb7ef369f4c683bd9896fc2ff2e2895 100644 (file)
@@ -5296,6 +5296,7 @@ extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *,
 extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *,
                          tree, tree);
 extern tree cp_reconstruct_complex_type                (tree, tree);
+extern bool attributes_naming_typedef_ok       (tree);
 extern void cplus_decl_attributes              (tree *, tree, int);
 extern void finish_anon_union                  (tree);
 extern void cp_write_global_declarations       (void);
index d7e5829a574ef9707972e8b89eacb8373e92738b..3652e8dd11ab16ce7ae1ddcdaa10d4c91a2c7d2f 100644 (file)
@@ -10216,6 +10216,7 @@ grokdeclarator (const cp_declarator *declarator,
          && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
          && TYPE_ANONYMOUS_P (type)
          && declspecs->type_definition_p
+         && attributes_naming_typedef_ok (*attrlist)
          && cp_type_quals (type) == TYPE_UNQUALIFIED)
        {
          tree t;
index 58419ecbbcb2d07da0f8cfbdf924178a9067d8a7..b2103c802df73eaafe4e672fb9da3bf798f57bfa 100644 (file)
@@ -1243,6 +1243,22 @@ save_template_attributes (tree *attr_p, tree *decl_p)
     }
 }
 
+/* Return true iff ATTRS are acceptable attributes to be applied in-place
+   to a typedef which gives a previously anonymous class or enum a name for
+   linkage purposes.  */
+
+bool
+attributes_naming_typedef_ok (tree attrs)
+{
+  for (; attrs; attrs = TREE_CHAIN (attrs))
+    {
+      tree name = get_attribute_name (attrs);
+      if (is_attribute_p ("vector_size", name))
+       return false;
+    }
+  return true;
+}
+
 /* Like reconstruct_complex_type, but handle also template trees.  */
 
 tree
index ce41c3b1930277b44bab7c2ee49d1b14272c3a80..fe2ddabae1deb3f5ef74203ba51146b9d1deb1f3 100644 (file)
@@ -2170,6 +2170,7 @@ no_linkage_check (tree t, bool relaxed_p)
     case ARRAY_TYPE:
     case POINTER_TYPE:
     case REFERENCE_TYPE:
+    case VECTOR_TYPE:
       return no_linkage_check (TREE_TYPE (t), relaxed_p);
 
     case OFFSET_TYPE:
diff --git a/gcc/testsuite/g++.dg/ext/vector26.C b/gcc/testsuite/g++.dg/ext/vector26.C
new file mode 100644 (file)
index 0000000..6d55158
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/59633
+// In C++98, the definition of bar is an error.  In C++11, bar implicitly
+// gets internal linkage.
+
+typedef enum { e } T __attribute__((vector_size(8)));
+static void foo(T t) {}
+void bar (T t) {}              // { dg-error "no linkage" "" { target c++98 } }
+// { dg-final { scan-assembler-not "globl\[ \t]*_Z3bar" } }
index 5fdd491a97de672dd9c9ec76a77013c04fe9e4a6..1d06ba7f47f52a5af73925c1a1981e983bec7d10 100644 (file)
@@ -10817,6 +10817,7 @@ walk_type_fields (tree type, walk_tree_fn func, void *data,
     {
     case POINTER_TYPE:
     case REFERENCE_TYPE:
+    case VECTOR_TYPE:
       /* We have to worry about mutually recursive pointers.  These can't
         be written in C.  They can in Ada.  It's pathological, but
         there's an ACATS test (c38102a) that checks it.  Deal with this