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
4 changes: 2 additions & 2 deletions clang/include/clang/Sema/Template.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ enum class TemplateSubstitutionKind : char {

/// Add a new outmost level to the multi-level template argument
/// list.
/// A 'Final' substitution means that Subst* nodes won't be built
/// for the replacements.
/// A 'Final' substitution means that these Args don't need to be
/// resugared later.
void addOuterTemplateArguments(Decl *AssociatedDecl, ArgList Args,
bool Final) {
assert(!NumRetainedOuterLevels &&
Expand Down
13 changes: 7 additions & 6 deletions clang/lib/Sema/SemaConcept.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -606,10 +606,9 @@ ConstraintSatisfactionChecker::SubstitutionInTemplateArguments(
Constraint.mappingOccurenceList();
// The empty MLTAL situation should only occur when evaluating non-dependent
// constraints.
if (!MLTAL.getNumSubstitutedLevels())
MLTAL.addOuterTemplateArguments(TD, {}, /*Final=*/false);
SubstitutedOuterMost =
llvm::to_vector_of<TemplateArgument>(MLTAL.getOutermost());
if (MLTAL.getNumSubstitutedLevels())
SubstitutedOuterMost =
llvm::to_vector_of<TemplateArgument>(MLTAL.getOutermost());
unsigned Offset = 0;
for (unsigned I = 0, MappedIndex = 0; I < Used.size(); I++) {
TemplateArgument Arg;
Expand All @@ -627,8 +626,10 @@ ConstraintSatisfactionChecker::SubstitutionInTemplateArguments(
if (Offset < SubstitutedOuterMost.size())
SubstitutedOuterMost.erase(SubstitutedOuterMost.begin() + Offset);

MLTAL.replaceOutermostTemplateArguments(TD, SubstitutedOuterMost);
return std::move(MLTAL);
MultiLevelTemplateArgumentList SubstitutedTemplateArgs;
SubstitutedTemplateArgs.addOuterTemplateArguments(TD, SubstitutedOuterMost,
/*Final=*/false);
return std::move(SubstitutedTemplateArgs);
}

ExprResult ConstraintSatisfactionChecker::EvaluateSlow(
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 @@ -1416,6 +1416,31 @@ concept IsEntitySpec =

}

namespace case8 {

template <class T>
struct type_identity {
using type = T;
};

template <typename Inner>
struct Cat {};

template <typename T>
concept CatConcept = requires {
[]<class Inner>(type_identity<Cat<Inner>>) {}(type_identity<T>{});
};

template <typename Dummy>
struct Feeder {
template <CatConcept Dummy2>
void feed() noexcept {}
};

void main() { Feeder<int>{}.feed<Cat<int>>(); }

}

}

namespace GH162125 {
Expand Down
Loading