re PR c++/56859 (alignas() fails in template)
authorJason Merrill <jason@redhat.com>
Thu, 25 Apr 2013 16:24:42 +0000 (12:24 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 25 Apr 2013 16:24:42 +0000 (12:24 -0400)
PR c++/56859
* typeck.c (cxx_alignas_expr): Handle value-dependence properly.

From-SVN: r198310

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp0x/gen-attrs-54.C [new file with mode: 0644]

index a1471dd..33fc34a 100644 (file)
@@ -1,5 +1,8 @@
 2013-04-25  Jason Merrill  <jason@redhat.com>
 
+       PR c++/56859
+       * typeck.c (cxx_alignas_expr): Handle value-dependence properly.
+
        PR c++/50261
        * init.c (perform_member_init): Call reshape_init.
 
index 84da5de..b761dd5 100644 (file)
@@ -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);
 }
 
 \f
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 (file)
index 0000000..45aa8e4
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/56859
+// { dg-require-effective-target c++11 }
+
+template<unsigned size, unsigned alignment>
+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);