
This patch tries to workaround the case that: - in a module unit that imports another module unit - both the module units including overlapped headers - the compiler emits false positive ODR violation diagnostics for the overlapped headers if ODR check is enabled - the current module units enables PCH For the third point, we disabled ODR check if the declarations comes from GMF. However, due to the forth point, the check whether the declaration comes from GMF failed. Then we still going to check it and then the users get false positive checks. What's worse is that, this always happens in clangd, where will generate the PCH automatically before parsing the input files. The root cause of the problem we mixed the modules in the semantical level and the module in the serialization level. The problem is pretty fundamental and we need time to fix that. But 19.x is going to be branched and I hope to give clangd better user experience. So I decided to land this workaround even if it is pretyy niche and may only work for the case of clangd's pattern.
52 lines
982 B
C++
52 lines
982 B
C++
// Test that we will skip ODR checks for declarations from PCH if they
|
|
// were from GMF.
|
|
//
|
|
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/A.cppm \
|
|
// RUN: -o %t/A.pcm -fskip-odr-check-in-gmf
|
|
// RUN: %clang_cc1 -std=c++20 -DDIFF -x c++-header %t/foo.h \
|
|
// RUN: -emit-pch -o %t/foo.pch -fskip-odr-check-in-gmf
|
|
// RUN: %clang_cc1 -std=c++20 %t/B.cppm -fmodule-file=A=%t/A.pcm -include-pch \
|
|
// RUN: %t/foo.pch -verify -fsyntax-only -fskip-odr-check-in-gmf
|
|
|
|
//--- foo.h
|
|
#ifndef FOO_H
|
|
#define FOO_H
|
|
inline int foo() {
|
|
#ifndef DIFF
|
|
return 43;
|
|
#else
|
|
return 45;
|
|
#endif
|
|
}
|
|
|
|
class f {
|
|
public:
|
|
int mem() {
|
|
#ifndef DIFF
|
|
return 47;
|
|
#else
|
|
return 45;
|
|
#endif
|
|
}
|
|
};
|
|
#endif
|
|
|
|
//--- A.cppm
|
|
module;
|
|
#include "foo.h"
|
|
export module A;
|
|
export using ::foo;
|
|
export using ::f;
|
|
|
|
//--- B.cppm
|
|
// expected-no-diagnostics
|
|
module;
|
|
#include "foo.h"
|
|
export module B;
|
|
import A;
|
|
export int b = foo() + f().mem();
|