Commit 05322543 by Jason Merrill Committed by Jason Merrill

re PR c++/48138 (__attribute__((aligned)) should give an error when applied to a…

re PR c++/48138 (__attribute__((aligned)) should give an error when applied to a typedef or template parameter, at least in C++0x mode.)

	PR c++/48138
	* tree.c (strip_typedefs): Use build_aligned_type.

From-SVN: r175215
parent 2602f8fe
2011-06-20 Jason Merrill <jason@redhat.com> 2011-06-20 Jason Merrill <jason@redhat.com>
PR c++/48138
* tree.c (strip_typedefs): Use build_aligned_type.
PR c++/49205 PR c++/49205
* call.c (sufficient_parms_p): Allow parameter packs too. * call.c (sufficient_parms_p): Allow parameter packs too.
......
...@@ -1167,6 +1167,16 @@ strip_typedefs (tree t) ...@@ -1167,6 +1167,16 @@ strip_typedefs (tree t)
if (!result) if (!result)
result = TYPE_MAIN_VARIANT (t); 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)) if (TYPE_ATTRIBUTES (t))
result = cp_build_type_attribute_variant (result, TYPE_ATTRIBUTES (t)); result = cp_build_type_attribute_variant (result, TYPE_ATTRIBUTES (t));
return cp_build_qualified_type (result, cp_type_quals (t)); return cp_build_qualified_type (result, cp_type_quals (t));
......
2011-06-20 Jason Merrill <jason@redhat.com> 2011-06-20 Jason Merrill <jason@redhat.com>
PR c++/48138
* g++.dg/ext/attr-aligned01.C: New.
PR c++/49205 PR c++/49205
* g++.dg/cpp0x/variadic-default.C: New. * g++.dg/cpp0x/variadic-default.C: New.
......
// 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment