c++: Make sure fold_sizeof_expr returns the correct type [PR117775]
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gcc_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-arm |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 |
success
|
Test passed
|
Commit Message
We currently ICE upon the following code, that is valid under
-Wno-pointer-arith:
=== cut here ===
int main() {
decltype( [](auto) { return sizeof(void); } ) x;
return x.operator()(0);
}
=== cut here ===
The problem is that "fold_sizeof_expr (sizeof(void))" returns
size_one_node, that has a different TREE_TYPE from that of the sizeof
expression, which later triggers an assert in cxx_eval_store_expression.
This patch makes sure that fold_sizeof_expr always returns a tree with
the type requested.
Successfully tested on x86_64-pc-linux-gnu.
PR c++/117775
gcc/cp/ChangeLog:
* decl.cc (fold_sizeof_expr): Make sure the folded result has
the requested TREE_TYPE.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/constexpr-117775.C: New test.
---
gcc/cp/decl.cc | 1 +
gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C | 13 +++++++++++++
2 files changed, 14 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C
@@ -11686,6 +11686,7 @@ fold_sizeof_expr (tree t)
false, false);
if (r == error_mark_node)
r = size_one_node;
+ r = cp_fold_convert (TREE_TYPE (t), r);
return r;
}
new file mode 100644
@@ -0,0 +1,13 @@
+// PR c++/117775
+// Check that we don't ICE and have sizeof(void)==1 under -Wno-pointer-arith
+// { dg-do run { target c++20 } }
+// { dg-additional-options "-Wno-pointer-arith" }
+
+int main() {
+ struct why :
+ decltype( [](auto) {
+ return sizeof(void);
+ })
+ {} x;
+ return 1 - x.operator()(0);
+}