
Close https://github.com/llvm/llvm-project/issues/138558 The compiler failed to understand the redeclaration-relationship when performing checks when MergeFunctionDecl. This seemed to be a complex circular problem (how can we know the redeclaration relationship before performing merging?). But the fix seems to be easy and safe. It is fine to only perform the check only if the using decl is a local decl.
66 lines
1.5 KiB
C++
66 lines
1.5 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/test-A.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/N.cppm -emit-reduced-module-interface -o %t/test-N.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/B.cppm -verify -fsyntax-only -fprebuilt-module-path=%t
|
|
|
|
//--- a.h
|
|
namespace N {
|
|
|
|
template <typename>
|
|
class C {
|
|
template <typename> friend void foo();
|
|
};
|
|
|
|
template <typename> void foo() {}
|
|
} // namespace N
|
|
|
|
//--- a.cppm
|
|
// This is some unrelated file. It also #includes system headers, but
|
|
// here does not even export anything.
|
|
module;
|
|
#include "a.h"
|
|
export module test:A;
|
|
export {
|
|
using N::C;
|
|
using N::foo;
|
|
}
|
|
|
|
//--- std.h
|
|
// Declarations typically #included from C++ header files:
|
|
namespace N { // In practice, this would be namespace std
|
|
inline namespace impl { // In practice, this would be namespace __1
|
|
template <typename>
|
|
class C {
|
|
template <typename> friend void foo();
|
|
};
|
|
|
|
template <typename> void foo() {}
|
|
} // namespace impl
|
|
} // namespace N
|
|
|
|
//--- N.cppm
|
|
module;
|
|
#include "std.h"
|
|
export module test:N;
|
|
|
|
// Now wrap these names into a module and export them:
|
|
export {
|
|
namespace N {
|
|
using N::C;
|
|
using N::foo;
|
|
}
|
|
}
|
|
|
|
//--- B.cppm
|
|
// expected-no-diagnostics
|
|
// A file that consumes the partitions from the other two files,
|
|
// including the exported N::C name.
|
|
module test:B;
|
|
import :N;
|
|
import :A;
|
|
|
|
N::C<int> x;
|