-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Sema] Lambdas are not part of immediate context for deduction
This commit implements [temp.deduct]p9. Test updates include: - New notes in `cxx1y-init-captures.cpp`, `lambda-expressions.cpp` and 'warn-unused-lambda-capture.cpp'. This seems to be caused by diagnosing errors earlier (during deduction) that were previously surfaced later (during instantiation). - New error `lambda-unevaluated.cpp` is in line with [temp.deduct]p9. Reviewed By: erichkeane, #clang-language-wg Differential Revision: https://reviews.llvm.org/D148802
- Loading branch information
1 parent
709098f
commit 629170f
Showing
28 changed files
with
194 additions
and
50 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
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
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
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
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
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,56 @@ | ||
// RUN: %clang_cc1 -std=c++20 -verify %s | ||
// [temp.deduct.p9] | ||
// A lambda-expression appearing in a function type or a template parameter is | ||
// not considered part of the immediate context for the purposes of template | ||
// argument deduction. | ||
// [Note: The intent is to avoid requiring implementations to deal with | ||
// substitution failure involving arbitrary statements.] | ||
template <class T> | ||
auto f(T) -> decltype([]() { T::invalid; } ()); | ||
void f(...); | ||
void test_f() { | ||
f(0); // expected-error@-3 {{type 'int' cannot be used prior to '::'}} | ||
// expected-note@-1 {{while substituting deduced template arguments}} | ||
// expected-note@-5 {{while substituting into a lambda expression here}} | ||
} | ||
|
||
template <class T, unsigned = sizeof([]() { T::invalid; })> | ||
void g(T); | ||
void g(...); | ||
void test_g() { | ||
g(0); // expected-error@-4 {{type 'int' cannot be used prior to '::'}} | ||
// expected-note@-4 {{in instantiation of default argument}} | ||
// expected-note@-2 {{while substituting deduced template arguments}} | ||
// expected-note@-7 {{while substituting into a lambda expression here}} | ||
} | ||
|
||
template <class T> | ||
auto h(T) -> decltype([x = T::invalid]() { }); | ||
void h(...); | ||
void test_h() { | ||
h(0); // expected-error@-3 {{type 'int' cannot be used prior to '::'}} | ||
// expected-note@-1 {{while substituting deduced template arguments}} | ||
// expected-note@-5 {{while substituting into a lambda expression here}} | ||
} | ||
|
||
template <class T> | ||
auto i(T) -> decltype([]() -> typename T::invalid { }); | ||
void i(...); | ||
void test_i() { | ||
i(0); // expected-error@-3 {{type 'int' cannot be used prior to '::'}} | ||
// expected-note@-1 {{while substituting deduced template arguments}} | ||
// expected-note@-5 {{while substituting into a lambda expression here}} | ||
} | ||
|
||
|
||
// In this example, the lambda itself is not part of an immediate context, but | ||
// substitution to the lambda expression succeeds, producing dependent | ||
// `decltype(x.invalid)`. The call to the lambda, however, is in the immediate context | ||
// and it produces a SFINAE failure. Hence, we pick the second overload | ||
// and don't produce any errors. | ||
template <class T> | ||
auto j(T t) -> decltype([](auto x) -> decltype(x.invalid) { } (t)); // #1 | ||
void j(...); // #2 | ||
void test_j() { | ||
j(0); // deduction fails on #1, calls #2. | ||
} |
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
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
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
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
Oops, something went wrong.