On June 6, 2020 6:17:49 AM GMT+02:00, Jason Merrill via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: >The problem in this testcase comes from cloning the constructor into >complete and base variants. When we clone the body the first time, >walk_tree_1 calls copy_tree_body_r on the type of the artificial >TYPE_DECL >we made for the VLA type without calling it on the decl itself, so we >overwrite the type of the TYPE_DECL without copying the decl first. > >This has been broken since we started inserting a TYPE_DECL for >anonymous >VLAs in r7-457. > >This patch fixes walk_tree_1 to call the function on the TYPE_DECL, as >we do >for other decls of a DECL_EXPR. > >Tested x86_64-pc-linux-gnu. OK for trunk? Release branches?
Looks reasonable. Please make sure to bootstrap and test with Ada enabled. Eric may also have comments here. In any case please wait a while before backporting. Thanks, Richard. >gcc/ChangeLog: > > PR c++/95552 > * tree.c (walk_tree_1): Call func on the TYPE_DECL of a DECL_EXPR. > >gcc/testsuite/ChangeLog: > > PR c++/95552 > * g++.dg/ext/vla23.C: New test. >--- > gcc/testsuite/g++.dg/ext/vla23.C | 14 ++++++++++++++ > gcc/tree.c | 5 +++++ > 2 files changed, 19 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/ext/vla23.C > >diff --git a/gcc/testsuite/g++.dg/ext/vla23.C >b/gcc/testsuite/g++.dg/ext/vla23.C >new file mode 100644 >index 00000000000..317a824b2f3 >--- /dev/null >+++ b/gcc/testsuite/g++.dg/ext/vla23.C >@@ -0,0 +1,14 @@ >+// PR c++/95552 >+// Test for VLA and cloned constructor. >+// { dg-additional-options -Wno-vla } >+// { dg-require-effective-target alloca } >+ >+struct VB { }; >+struct ViewDom: virtual VB >+{ >+ ViewDom(int i) { char (*a)[i]; } >+}; >+void element( ) >+{ >+ ViewDom a(2); >+} >diff --git a/gcc/tree.c b/gcc/tree.c >index 7197b4720ce..c8e9680b06c 100644 >--- a/gcc/tree.c >+++ b/gcc/tree.c >@@ -12212,6 +12212,11 @@ walk_tree_1 (tree *tp, walk_tree_fn func, void >*data, > Note that DECLs get walked as part of processing the BIND_EXPR. */ > if (TREE_CODE (DECL_EXPR_DECL (*tp)) == TYPE_DECL) > { >+ /* Call the function for the decl so e.g. inlining can remap it. >*/ >+ result = (*func) (&DECL_EXPR_DECL (*tp), &walk_subtrees, data); >+ if (result || !walk_subtrees) >+ return result; >+ > tree *type_p = &TREE_TYPE (DECL_EXPR_DECL (*tp)); > if (TREE_CODE (*type_p) == ERROR_MARK) > return NULL_TREE; > >base-commit: 5bc13e5217f687f5d08a7022b4c6081befc54402