Close https://github.com/llvm/llvm-project/issues/61064. The root cause of the issue is that we will deserilize some declarations eagerly when reading the BMI. However, many declarations in the BMI are not necessary for the importer. So it wastes a lot of time. The new commit handles the MSVC's extension #pragma comment and #pragma detect_mismatch to follow MSVC's behavior. See pr61783 for details.
111 lines
2.6 KiB
C++
111 lines
2.6 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/e.cppm -o %t/e.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/f.cppm -o %t/f.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %t/g.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 -emit-module-interface %t/i.cppm \
|
|
// RUN: -fprebuilt-module-path=%t -o %t/i.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %t/j.cpp \
|
|
// RUN: -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %t/k.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}}
|
|
}
|
|
|
|
//--- foo.h
|
|
void foo() {
|
|
|
|
}
|
|
|
|
//--- bar.h
|
|
void bar();
|
|
void foo() {
|
|
bar();
|
|
}
|
|
|
|
//--- e.cppm
|
|
module;
|
|
#include "foo.h"
|
|
export module e;
|
|
export using ::foo;
|
|
|
|
//--- f.cppm
|
|
module;
|
|
#include "bar.h"
|
|
export module f;
|
|
export using ::foo;
|
|
|
|
//--- g.cpp
|
|
import e;
|
|
import f;
|
|
void use() {
|
|
foo(); // expected-error@* {{'foo' has different definitions in different modules;}}
|
|
// expected-note@* {{but in 'e.<global>' found a different body}}
|
|
}
|
|
|
|
//--- h.cppm
|
|
export module h;
|
|
export import a;
|
|
export import b;
|
|
|
|
//--- i.cppm
|
|
export module i;
|
|
export import e;
|
|
export import f;
|
|
|
|
//--- 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}}
|
|
}
|
|
|
|
//--- k.cpp
|
|
import i;
|
|
void use() {
|
|
foo(); // expected-error@* {{'foo' has different definitions in different modules;}}
|
|
// expected-note@* {{but in 'e.<global>' found a different body}}
|
|
}
|
|
|