re PR c++/48138 (__attribute__((aligned)) should give an error when applied to a...
authorJason Merrill <jason@redhat.com>
Mon, 20 Jun 2011 14:40:19 +0000 (10:40 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 20 Jun 2011 14:40:19 +0000 (10:40 -0400)
PR c++/48138
* tree.c (strip_typedefs): Use build_aligned_type.

From-SVN: r175215

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/attr-aligned01.C [new file with mode: 0644]

index 87e5164d9b6c5a969864edb55dff6c73084e8320..d88dc6089dac6b17e039c34a56cbb1af96310226 100644 (file)
@@ -1,5 +1,8 @@
 2011-06-20  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48138
+       * tree.c (strip_typedefs): Use build_aligned_type.
+
        PR c++/49205
        * call.c (sufficient_parms_p): Allow parameter packs too.
 
index c1824b4626ba3377a010fb0d7d7db011176e4171..31005084b3cd80421b9af84beb57739076b219c1 100644 (file)
@@ -1167,6 +1167,16 @@ strip_typedefs (tree t)
 
   if (!result)
       result = TYPE_MAIN_VARIANT (t);
+  if (TYPE_USER_ALIGN (t) != TYPE_USER_ALIGN (result)
+      || TYPE_ALIGN (t) != TYPE_ALIGN (result))
+    {
+      gcc_assert (TYPE_USER_ALIGN (t));
+      if (TYPE_ALIGN (t) == TYPE_ALIGN (result))
+       result = build_variant_type_copy (result);
+      else
+       result = build_aligned_type (result, TYPE_ALIGN (t));
+      TYPE_USER_ALIGN (result) = true;
+    }
   if (TYPE_ATTRIBUTES (t))
     result = cp_build_type_attribute_variant (result, TYPE_ATTRIBUTES (t));
   return cp_build_qualified_type (result, cp_type_quals (t));
index abc624597dab6de6abcd60f44a4d655b63679ba3..99d4d3d410a60f59182bd808f303c24ebc5d472d 100644 (file)
@@ -1,5 +1,8 @@
 2011-06-20  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48138
+       * g++.dg/ext/attr-aligned01.C: New.
+
        PR c++/49205
        * g++.dg/cpp0x/variadic-default.C: New.
 
diff --git a/gcc/testsuite/g++.dg/ext/attr-aligned01.C b/gcc/testsuite/g++.dg/ext/attr-aligned01.C
new file mode 100644 (file)
index 0000000..a051c6e
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/48138
+// { dg-options -std=c++0x }
+
+#define ALIGNED(x) __attribute__((aligned(x)))
+#define SA(X) static_assert ((X),#X)
+
+template<typename T>
+void type_alignment(const T&) {
+  struct { char c; T t; } s;
+  SA((char*)&s.t - (char*)&s.c == 8);
+}
+
+int main() {
+  typedef char unaligned[15];
+  typedef char aligned[15] ALIGNED(8);
+
+  aligned z;
+  type_alignment(z);
+  type_alignment<unaligned ALIGNED(8)>(z);
+}