From 2823b4d96d9ec4ad4e67e5e8edaa1b060a467491 Mon Sep 17 00:00:00 2001 From: Nathaniel Shead Date: Thu, 29 Feb 2024 22:49:13 +1100 Subject: [PATCH] c++: Ensure DECL_CONTEXT is set for temporary vars [PR114005] Modules streaming requires DECL_CONTEXT to be set for anything streamed. This patch ensures that 'create_temporary_var' does set a DECL_CONTEXT for these variables (such as the backing storage for initializer_lists) even if not inside a function declaration. PR c++/114005 gcc/cp/ChangeLog: * init.cc (create_temporary_var): Use current_scope instead of current_function_decl. gcc/testsuite/ChangeLog: * g++.dg/modules/pr114005_a.C: New test. * g++.dg/modules/pr114005_b.C: New test. Signed-off-by: Nathaniel Shead --- gcc/cp/init.cc | 2 +- gcc/testsuite/g++.dg/modules/pr114005_a.C | 8 ++++++++ gcc/testsuite/g++.dg/modules/pr114005_b.C | 7 +++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/modules/pr114005_a.C create mode 100644 gcc/testsuite/g++.dg/modules/pr114005_b.C diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index 1a341f7e606..d2586fad86b 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -4258,7 +4258,7 @@ create_temporary_var (tree type) TREE_USED (decl) = 1; DECL_ARTIFICIAL (decl) = 1; DECL_IGNORED_P (decl) = 1; - DECL_CONTEXT (decl) = current_function_decl; + DECL_CONTEXT (decl) = current_scope (); return decl; } diff --git a/gcc/testsuite/g++.dg/modules/pr114005_a.C b/gcc/testsuite/g++.dg/modules/pr114005_a.C new file mode 100644 index 00000000000..404683484ec --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr114005_a.C @@ -0,0 +1,8 @@ +// { dg-additional-options "-fmodules-ts" } +// { dg-module-cmi M } + +module; +#include + +export module M; +export constexpr std::initializer_list foo{ 1, 2, 3 }; diff --git a/gcc/testsuite/g++.dg/modules/pr114005_b.C b/gcc/testsuite/g++.dg/modules/pr114005_b.C new file mode 100644 index 00000000000..88317ce11f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr114005_b.C @@ -0,0 +1,7 @@ +// { dg-additional-options "-fmodules-ts" } + +import M; + +int main() { + return foo.size(); +}