Close https://github.com/llvm/llvm-project/issues/79240. See the linked issue for details. Given the frequency of issue reporting about false positive ODR checks (I received private issue reports too), I'd like to backport this to 18.x too.
58 lines
1.4 KiB
C++
58 lines
1.4 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: split-file %s %t
|
|
// RUN: cd %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/a.cppm -o %t/a.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/b.cppm -o %t/b.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %t/c.cpp \
|
|
// RUN: -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %t/d.cpp \
|
|
// RUN: -fprebuilt-module-path=%t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/h.cppm \
|
|
// RUN: -fprebuilt-module-path=%t -o %t/h.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %t/j.cpp \
|
|
// RUN: -fprebuilt-module-path=%t
|
|
|
|
//--- a.cppm
|
|
export module a;
|
|
export void foo() {
|
|
|
|
}
|
|
|
|
//--- b.cppm
|
|
export module b;
|
|
void bar();
|
|
export void foo() {
|
|
bar();
|
|
}
|
|
|
|
//--- c.cpp
|
|
// expected-no-diagnostics
|
|
// Since we will load all the declaration lazily, we won't be able to find
|
|
// the ODR violation here.
|
|
import a;
|
|
import b;
|
|
|
|
//--- d.cpp
|
|
import a;
|
|
import b;
|
|
// Test that we can still check the odr violation if we call the function
|
|
// actually.
|
|
void use() {
|
|
foo(); // expected-error@* {{'foo' has different definitions in different modules;}}
|
|
// expected-note@* {{but in 'a' found a different body}}
|
|
}
|
|
|
|
//--- h.cppm
|
|
export module h;
|
|
export import a;
|
|
export import b;
|
|
|
|
//--- j.cpp
|
|
import h;
|
|
void use() {
|
|
foo(); // expected-error@* {{'foo' has different definitions in different modules;}}
|
|
// expected-note@* {{but in 'a' found a different body}}
|
|
}
|