From 282c399b39bc92f5f3765a96bf13025873370e77 Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@redhat.com>
Date: Mon, 4 Jan 2010 12:53:37 -0500
Subject: [PATCH] re PR c++/42555 (16-byte aligned double is disallowed only in
 templates)

	PR c++/42555
	* pt.c (tsubst_decl): Don't apply type attributes in place.

From-SVN: r155628
---
 gcc/cp/ChangeLog                    |  3 +++
 gcc/cp/pt.c                         |  2 +-
 gcc/testsuite/ChangeLog             |  3 +++
 gcc/testsuite/g++.dg/ext/attrib35.C | 19 +++++++++++++++++++
 4 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/ext/attrib35.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 77dd1df69540..427e57f4f0fb 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
 2010-01-04  Jason Merrill  <jason@redhat.com>
 
+	PR c++/42555
+	* pt.c (tsubst_decl): Don't apply type attributes in place.
+
 	PR c++/42567
 	* semantics.c (describable_type): Remove decltype comment and
 	semantics.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index d5342a1653fd..d2a1f9d6e2e5 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -9400,7 +9400,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
 	TREE_CHAIN (r) = NULL_TREE;
 
 	apply_late_template_attributes (&r, DECL_ATTRIBUTES (r),
-					(int) ATTR_FLAG_TYPE_IN_PLACE,
+					/*flags=*/0,
 					args, complain, in_decl);
 
 	/* Preserve a typedef that names a type.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8d559e91c3b2..aebd716b189a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2010-01-04  Jason Merrill  <jason@redhat.com>
 
+	PR c++/42555
+	* g++.dg/ext/attrib35.C: New.
+
 	PR c++/42567
 	* g++.dg/cpp0x/auto17.C: New.
 
diff --git a/gcc/testsuite/g++.dg/ext/attrib35.C b/gcc/testsuite/g++.dg/ext/attrib35.C
new file mode 100644
index 000000000000..60c48403e25b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib35.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target i*86-*-* x86_64-*-* } }
+// { dg-options "-O3 -msse2" }
+
+// You can make NON-template typedefs with a large alignment.
+typedef double AlignedDoubleType __attribute__((aligned(16)));
+
+template <typename RealType>
+RealType f(const RealType* p)
+{
+  // But if you use a template parameter it complains.
+  typedef RealType AlignedRealType __attribute__((aligned(16)));
+
+  return p[0];
+}
+
+double f2(const double* p)
+{
+  return f<double>(p);
+}
-- 
GitLab