Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[C++20] [Modules] Allow ADL in dependent context for modules
Close llvm/llvm-project#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.
- Loading branch information
1 parent
4b4e8cf
commit 3ce6686
Showing
3 changed files
with
115 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// 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>(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
// 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 -fsyntax-only -verify | ||
|
||
//--- a.h | ||
namespace n { | ||
|
||
struct s { }; | ||
|
||
void operator+(s, int) { | ||
} | ||
|
||
} // namespace n | ||
|
||
//--- a.cppm | ||
module; | ||
#include "a.h" | ||
export module a; | ||
|
||
export template<typename T> | ||
void a(T x) { | ||
n::s() + x; | ||
} | ||
|
||
//--- b.cppm | ||
// expected-no-diagnostics | ||
export module b; | ||
import a; | ||
|
||
void b() { | ||
a(0); | ||
} |