C++ PATCH for c++/90736 - bogus error with alignof
Marek Polacek
polacek@redhat.com
Mon Jun 10 00:45:00 GMT 2019
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 <polacek@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;
More information about the Gcc-patches
mailing list