Chuanqi Xu e72d956b99
[C++20] [Modules] Don't diagnose duplicated implicit decl in multiple named modules (#102423)
Close https://github.com/llvm/llvm-project/issues/102360 
Close https://github.com/llvm/llvm-project/issues/102349

http://eel.is/c++draft/basic.def.odr#15.3 makes it clear that the
duplicated deinition are not allowed to be attached to named modules.

But we need to filter the implicit declarations as user can do nothing
about it and the diagnostic message is annoying.
2024-08-08 13:29:59 +08:00

53 lines
934 B
C++

// 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 -emit-module-interface -o %t/b.pcm \
// RUN: -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 %t/c.cppm -emit-module-interface -o %t/c.pcm \
// RUN: -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 %t/d.cpp -fsyntax-only -verify \
// RUN: -fprebuilt-module-path=%t
//--- a.cppm
export module a;
export template<typename>
struct a;
template<typename>
struct a {
};
export template<typename T>
constexpr auto aa = a<T>();
//--- b.cppm
export module b;
import a;
static void b() {
static_cast<void>(a<void>());
}
//--- c.cppm
export module c;
import a;
static void c() {
static_cast<void>(aa<void>);
}
//--- d.cpp
// expected-no-diagnostics
import a;
import b;
import c;
static void d() {
static_cast<void>(a<void>());
}