https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/109882
This adds to the assert the implicit global module case as in module purview. Fixes #109879 >From b1a659af4fccba0f7511ab52f0932d5a32958eb7 Mon Sep 17 00:00:00 2001 From: Matheus Izvekov <mizve...@gmail.com> Date: Tue, 24 Sep 2024 20:02:05 -0300 Subject: [PATCH] [clang] fix assert in ADL finding entity in the implicit global module This adds to the assert the implicit global module case as in module purview. Fixes #109879 --- clang/docs/ReleaseNotes.rst | 7 +++++-- clang/lib/Sema/SemaLookup.cpp | 5 +++-- clang/test/Modules/GH109879-1.cpp | 26 ++++++++++++++++++++++++++ clang/test/Modules/GH109879-2.cpp | 29 +++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 clang/test/Modules/GH109879-1.cpp create mode 100644 clang/test/Modules/GH109879-2.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e511614fcf2451..5923888383022a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -43,7 +43,7 @@ code bases. still supporting SPARC V8 CPUs need to specify ``-mcpu=v8`` with a `config file <https://clang.llvm.org/docs/UsersManual.html#configuration-files>`_. - + - The ``clang-rename`` tool has been removed. C/C++ Language Potentially Breaking Changes @@ -115,7 +115,7 @@ C++ Language Changes - Allow single element access of GCC vector/ext_vector_type object to be constant expression. Supports the `V.xyzw` syntax and other tidbits as seen in OpenCL. Selecting multiple elements is left as a future work. -- Implement `CWG1815 <https://wg21.link/CWG1815>`_. Support lifetime extension +- Implement `CWG1815 <https://wg21.link/CWG1815>`_. Support lifetime extension of temporary created by aggregate initialization using a default member initializer. @@ -452,6 +452,9 @@ Miscellaneous Clang Crashes Fixed - Fixed ``-ast-dump`` crashes on codes involving ``concept`` with ``-ast-dump-decl-types``. (#GH94928) +- Fixed internal assertion firing when a declaration in the implicit global + module is found through ADL. (GH#109879) + OpenACC Specific Changes ------------------------ diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index ed5d44aa898f4f..f3f62474d06441 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -3850,8 +3850,9 @@ void Sema::ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, // exports are only valid in module purview and outside of any // PMF (although a PMF should not even be present in a module // with an import). - assert(FM && FM->isNamedModule() && !FM->isPrivateModule() && - "bad export context"); + assert(FM && + (FM->isNamedModule() || FM->isImplicitGlobalModule()) && + !FM->isPrivateModule() && "bad export context"); // .. are attached to a named module M, do not appear in the // translation unit containing the point of the lookup.. if (D->isInAnotherModuleUnit() && diff --git a/clang/test/Modules/GH109879-1.cpp b/clang/test/Modules/GH109879-1.cpp new file mode 100644 index 00000000000000..a984556b382e20 --- /dev/null +++ b/clang/test/Modules/GH109879-1.cpp @@ -0,0 +1,26 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm +// RUN: %clang_cc1 -std=c++20 %t/B.cppm -fprebuilt-module-path=%t -emit-module-interface -o %t/B.pcm +// RUN: %clang_cc1 -fsyntax-only -std=c++20 -fprebuilt-module-path=%t -verify %t/C.cpp + +//--- A.cppm +module; +export module A; +export extern "C" void foo(struct Bar); + +//--- B.cppm +module; +import A; +export module B; + +//--- C.cpp +import B; +struct Bar {}; +void test() { + foo(Bar()); + // expected-error@-1 {{declaration of 'foo' must be imported}} + // expected-n...@a.cppm:3 {{declaration here is not visible}} +} diff --git a/clang/test/Modules/GH109879-2.cpp b/clang/test/Modules/GH109879-2.cpp new file mode 100644 index 00000000000000..ccec57839898a2 --- /dev/null +++ b/clang/test/Modules/GH109879-2.cpp @@ -0,0 +1,29 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm +// RUN: %clang_cc1 -std=c++20 %t/B.cppm -fprebuilt-module-path=%t -emit-module-interface -o %t/B.pcm +// RUN: %clang_cc1 -fsyntax-only -std=c++20 -fprebuilt-module-path=%t -verify %t/C.cpp + +//--- foo.h +struct Bar {}; +extern "C" void foo(struct Bar); + +//--- A.cppm +module; +#include "foo.h" +export module A; +export extern "C" using ::foo; +//--- B.cppm +module; +import A; +export module B; + +//--- C.cpp +// expected-no-diagnostics +import B; +#include "foo.h" +void test() { + foo(Bar()); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits