From: Jason Merrill Date: Thu, 25 Apr 2013 16:24:42 +0000 (-0400) Subject: re PR c++/56859 (alignas() fails in template) X-Git-Tag: upstream/12.2.0~70011 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=17365662e484b762af97f4b25f483411ebec3fb0;p=platform%2Fupstream%2Fgcc.git re PR c++/56859 (alignas() fails in template) PR c++/56859 * typeck.c (cxx_alignas_expr): Handle value-dependence properly. From-SVN: r198310 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a1471dd..33fc34a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2013-04-25 Jason Merrill + PR c++/56859 + * typeck.c (cxx_alignas_expr): Handle value-dependence properly. + PR c++/50261 * init.c (perform_member_init): Call reshape_init. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 84da5de..b761dd5 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1725,15 +1725,19 @@ cxx_alignas_expr (tree e) When the alignment-specifier is of the form alignas(type-id ), it shall have the same effect as - alignas( alignof(type-id )). */ + alignas(alignof(type-id )). */ return cxx_sizeof_or_alignof_type (e, ALIGNOF_EXPR, false); - /* If we reach this point, it means the alignas expression if of the form "alignas(assignment-expression)", so we should follow what is stated by [dcl.align]/2. */ + if (value_dependent_expression_p (e)) + /* Leave value-dependent expression alone for now. */ + return e; + + e = fold_non_dependent_expr (e); e = mark_rvalue_use (e); /* [dcl.align]/2 says: @@ -1741,18 +1745,7 @@ cxx_alignas_expr (tree e) the assignment-expression shall be an integral constant expression. */ - e = fold_non_dependent_expr (e); - if (value_dependent_expression_p (e)) - /* Leave value-dependent expression alone for now. */; - else - e = cxx_constant_value (e); - - if (e == NULL_TREE - || e == error_mark_node - || TREE_CODE (e) != INTEGER_CST) - return error_mark_node; - - return e; + return cxx_constant_value (e); } diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C new file mode 100644 index 0000000..45aa8e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C @@ -0,0 +1,14 @@ +// PR c++/56859 +// { dg-require-effective-target c++11 } + +template +struct aligned_storage +{ + using type = struct { alignas(alignment) unsigned char data[size]; }; +}; + +#define SA(X) static_assert((X),#X) +SA(alignof(aligned_storage<8,1>::type) == 1); +SA(alignof(aligned_storage<8,2>::type) == 2); +SA(alignof(aligned_storage<8,4>::type) == 4); +SA(alignof(aligned_storage<8,8>::type) == 8);