Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ Bug Fixes to C++ Support
- Fix a crash when attempting to deduce a deduction guide from a non deducible template template parameter. (#130604)
- Fix for clang incorrectly rejecting the default construction of a union with
nontrivial member when another member has an initializer. (#GH81774)
- Fixed a template depth issue when parsing lambdas inside a type constraint. (#GH162092)
- Diagnose unresolved overload sets in non-dependent compound requirements. (#GH51246) (#GH97753)

Bug Fixes to AST Handling
Expand Down
6 changes: 6 additions & 0 deletions clang/lib/Parse/ParseTemplate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,12 @@ bool Parser::isTypeConstraintAnnotation() {
bool Parser::TryAnnotateTypeConstraint() {
if (!getLangOpts().CPlusPlus20)
return false;
// The type constraint may declare template parameters, notably
// if it contains a generic lambda, so we need to increment
// the template depth as these parameters would not be instantiated
// at the current depth.
TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
++CurTemplateDepthTracker;
CXXScopeSpec SS;
bool WasScopeAnnotation = Tok.is(tok::annot_cxxscope);
if (ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr,
Expand Down
25 changes: 25 additions & 0 deletions clang/test/SemaTemplate/concepts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1489,6 +1489,31 @@ static_assert( requires {{ &f } -> C;} ); // expected-error {{reference to overl

}

namespace GH162092 {

template <typename T>
struct vector;

template <typename T, typename U>
concept C = __is_same_as(T, U);

template<class T, auto Cpt>
concept generic_range_value = requires {
Cpt.template operator()<int>();
};


template<generic_range_value<[]<
C<int>
>() {}> T>
void x() {}

void foo() {
x<vector<int>>();
}

}

namespace GH162770 {
enum e {};
template<e> struct s {};
Expand Down
Loading