From 7768cadb4246117964a9ba159740da3b9c20811d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 17 Feb 2021 15:03:25 +0100 Subject: [PATCH] c++: Fix up build_zero_init_1 once more [PR99106] My earlier build_zero_init_1 patch for flexible array members created an empty CONSTRUCTOR. As the following testcase shows, that doesn't work very well because the middle-end doesn't expect CONSTRUCTOR elements with incomplete type (that the empty CONSTRUCTOR at the end of outer CONSTRUCTOR had). The following patch just doesn't add any CONSTRUCTOR for the flexible array members, it doesn't seem to be needed. 2021-02-17 Jakub Jelinek PR sanitizer/99106 * init.c (build_zero_init_1): For flexible array members just return NULL_TREE instead of returning empty CONSTRUCTOR with non-complete ARRAY_TYPE. * g++.dg/ubsan/pr99106.C: New test. --- gcc/cp/init.c | 2 +- gcc/testsuite/g++.dg/ubsan/pr99106.C | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ubsan/pr99106.C diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 49950d40521..7d598f6196d 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -252,7 +252,7 @@ build_zero_init_1 (tree type, tree nelts, bool static_storage_p, build_one_cst (TREE_TYPE (nelts))); /* Treat flexible array members like [0] arrays. */ else if (TYPE_DOMAIN (type) == NULL_TREE) - max_index = build_minus_one_cst (sizetype); + return NULL_TREE; else max_index = array_type_nelts (type); diff --git a/gcc/testsuite/g++.dg/ubsan/pr99106.C b/gcc/testsuite/g++.dg/ubsan/pr99106.C new file mode 100644 index 00000000000..ccb48a96f4b --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/pr99106.C @@ -0,0 +1,5 @@ +// PR sanitizer/99106 +// { dg-do compile } +// { dg-options "-fsanitize=undefined" } + +#include "../ext/flexary38.C" -- 2.30.2