Files
clang-p2996/clang/test/Modules/named-modules-adl-3.cppm
Chuanqi Xu 60a3784b3e [C++20] [Modules] Handle modules visible relationship properly
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.
2023-05-09 18:36:37 +08:00

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;
}