The problem here is that we're getting "requested alignment is not an integer constant" since r261971, because of this part of the patch:
@ -4676,7 +4685,11 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, conversion. */ return fold (t); - if (tcode == UNARY_PLUS_EXPR) + /* Handle an array's bounds having been deduced after we built + the wrapping expression. */ + if (same_type_ignoring_tlq_and_bounds_p (type, TREE_TYPE (op))) + r = op; + else if (tcode == UNARY_PLUS_EXPR) r = fold_convert (TREE_TYPE (t), op); else r = fold_build1 (tcode, type, op); where type was "int" and TREE_TYPE (op) was "const int", so we just used OP which was an INTEGER_CST of type "const int". That resulted in a NOP_EXPR causing the error above. Previously, we'd fold_build, returning an INTEGER_CST with type "int". It seems weird to me to have an INTEGER_CST with a cv-qual type, so the following patch handles that case in adjust_temp_type. Bootstrapped/regtested on x86_64-linux, ok for trunk and 9? 2019-06-09 Marek Polacek <pola...@redhat.com> PR c++/90736 - bogus error with alignof. * constexpr.c (adjust_temp_type): Use cv_unqualified type. * g++.dg/cpp0x/alignof5.C: New test. diff --git gcc/cp/constexpr.c gcc/cp/constexpr.c index 10afc419a33..a0d09de064d 100644 --- gcc/cp/constexpr.c +++ gcc/cp/constexpr.c @@ -1337,7 +1337,9 @@ adjust_temp_type (tree type, tree temp) if (TREE_CODE (temp) == EMPTY_CLASS_EXPR) return build0 (EMPTY_CLASS_EXPR, type); gcc_assert (scalarish_type_p (type)); - return cp_fold_convert (type, temp); + /* Now we know we're dealing with a scalar, and a prvalue of non-class + type is cv-unqualified. */ + return cp_fold_convert (cv_unqualified (type), temp); } /* Callback for walk_tree used by unshare_constructor. */ diff --git gcc/testsuite/g++.dg/cpp0x/alignof5.C gcc/testsuite/g++.dg/cpp0x/alignof5.C new file mode 100644 index 00000000000..09354d3e1d0 --- /dev/null +++ gcc/testsuite/g++.dg/cpp0x/alignof5.C @@ -0,0 +1,6 @@ +// PR c++/90736 - bogus error with alignof. +// { dg-do compile { target c++11 } } + +constexpr int fn(const int b) { return b; } +constexpr int c = fn(alignof(int)); +alignas(c) char d;