Close https://github.com/llvm/llvm-project/issues/62589. Previously, for global module fragments, we will justify if it is visible by the visibility of their top level parents. But this is an overkill, it is problematic if we have a deduction guide in the global module fragments. See the attached test for example. In this example, we will mark the global module fragments as visible, but our old strategy will miss the case surprisingly due to we will only search for the top level modules.
65 lines
1.5 KiB
C++
65 lines
1.5 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: split-file %s %t
|
|
// RUN: cd %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 -fmodule-file=a=%t/a.pcm -emit-module-interface \
|
|
// RUN: -o %t/b.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/c.cppm -fmodule-file=a=%t/a.pcm -fmodule-file=b=%t/b.pcm \
|
|
// RUN: -fsyntax-only -verify
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 -DEXPORT_OPERATOR %t/a.cppm -emit-module-interface -o %t/a.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -DEXPORT_OPERATOR %t/b.cppm -fmodule-file=a=%t/a.pcm \
|
|
// RUN: -emit-module-interface -o %t/b.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -DEXPORT_OPERATOR %t/c.cppm -fmodule-file=a=%t/a.pcm \
|
|
// RUN: -fmodule-file=b=%t/b.pcm -fsyntax-only -verify
|
|
|
|
//--- foo.h
|
|
namespace n {
|
|
|
|
struct s { };
|
|
|
|
void operator+(s, int) {}
|
|
|
|
} // namespace n
|
|
|
|
//--- a.cppm
|
|
module;
|
|
#include "foo.h"
|
|
export module a;
|
|
export namespace n {
|
|
using n::s;
|
|
#ifdef EXPORT_OPERATOR
|
|
using n::operator+;
|
|
#endif
|
|
}
|
|
|
|
//--- b.cppm
|
|
export module b;
|
|
export import a;
|
|
|
|
export template<typename T>
|
|
void b(T x) {
|
|
n::s() + x;
|
|
}
|
|
|
|
//--- c.cppm
|
|
#ifdef EXPORT_OPERATOR
|
|
// expected-no-diagnostics
|
|
#endif
|
|
export module c;
|
|
import b;
|
|
|
|
void c(int x) {
|
|
#ifndef EXPORT_OPERATOR
|
|
// expected-error@b.cppm:6 {{invalid operands to binary expression ('n::s' and 'int')}}
|
|
// expected-note@+2 {{in instantiation of function template specialization 'b<int>' requested here}}
|
|
#endif
|
|
b(0);
|
|
|
|
#ifndef EXPORT_OPERATOR
|
|
// expected-error@+2 {{invalid operands to binary expression ('n::s' and 'int')}}
|
|
#endif
|
|
n::s() + x;
|
|
}
|