
Close https://github.com/llvm/llvm-project/issues/60488. Previously, when we instantiate a template, the argument dependent lookup is performed in the context of the instantiation, which implies that the functions not visible in the context can't be found by the argument dependent lookup. But this is not true, according to [module.context]p3, the instantiation context for the implicit instantiation of a template should contain the context of the primary module interface if the template is defined in the module interface unit. Note that the fix didn't implemnet [module.context]p3 precisely, see the comments for example.
42 lines
654 B
C++
42 lines
654 B
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=%t/a.pcm -emit-module-interface -o %t/b.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/c.cppm -fmodule-file=%t/b.pcm -fsyntax-only -verify
|
|
|
|
//--- a.cppm
|
|
export module a;
|
|
|
|
export template<typename T>
|
|
void a(T x) {
|
|
+x;
|
|
}
|
|
|
|
//--- b.h
|
|
struct s {
|
|
};
|
|
void operator+(s) {
|
|
}
|
|
|
|
//--- b.cppm
|
|
module;
|
|
#include "b.h"
|
|
export module b;
|
|
import a;
|
|
|
|
export template<typename T>
|
|
void b() {
|
|
a(s());
|
|
}
|
|
|
|
//--- c.cppm
|
|
// expected-no-diagnostics
|
|
export module c;
|
|
import b;
|
|
|
|
void c() {
|
|
b<int>();
|
|
}
|