Skip to content

Commit a1eb5b5

Browse files
committed
Fix assert, address feedback, add tests
1 parent 2843ad3 commit a1eb5b5

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

clang/include/clang/Sema/SemaConcept.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ struct NormalizedConstraint {
196196
assert(getKind() != ConstraintKind::Compound);
197197
assert(Indexes.count() == Args.size());
198198
assert(IndexesForSubsumption.size() == Indexes.size());
199-
assert((Indexes & IndexesForSubsumption) == Indexes);
199+
assert((Indexes | IndexesForSubsumption) == Indexes);
200200

201201
Atomic.IndexesForSubsumption = std::move(IndexesForSubsumption);
202202
Atomic.Indexes = std::move(Indexes);

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7182,7 +7182,6 @@ void Sema::MarkUsedTemplateParametersForSubsumptionParameterMapping(
71827182
const Expr *E, unsigned Depth, llvm::SmallBitVector &Used) {
71837183
MarkUsedTemplateParameterVisitor(Used, Depth, /*VisitDeclRefTypes=*/false)
71847184
.TraverseStmt(const_cast<Expr *>(E));
7185-
return;
71867185
}
71877186

71887187
void

clang/test/SemaTemplate/instantiate-template-argument.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,62 @@ static_assert(foo<'a'>() == 3);
2727
// expected-error@-1{{call to 'foo' is ambiguous}}
2828
// expected-note@#cand2 {{candidate function}}
2929
// expected-note@#cand3 {{candidate function}}
30+
31+
32+
namespace case1 {
33+
34+
template<auto T, decltype(T) U>
35+
concept C1 = sizeof(T) >= 4; // #case1_C1
36+
37+
template<typename Y, char V>
38+
concept C2 = C1<Y{}, V>; // #case1_C2
39+
40+
template<class T, char W>
41+
constexpr int foo() requires C2<T, W> { return 1; } // #case1_foo1
42+
43+
template<class T, char X>
44+
constexpr int foo() requires C1<T{}, X> && true { return 2; } // #case1_foo2
45+
46+
static_assert(foo<char, 'a'>() == 2);
47+
// expected-error@-1{{no matching function for call to 'foo'}}
48+
// expected-note@#case1_foo1{{candidate template ignored: constraints not satisfied [with T = char, W = 'a']}}
49+
// expected-note@#case1_foo1{{because 'C2<char, 'a'>' evaluated to false}}
50+
// expected-note@#case1_C2{{because 'C1<Y{}, V>' evaluated to false}}
51+
// expected-note@#case1_C1{{because 'sizeof ('\x00') >= 4' (1 >= 4) evaluated to false}}
52+
// expected-note@#case1_foo2{{candidate template ignored: constraints not satisfied [with T = char, X = 'a']}}
53+
// expected-note@#case1_foo2{{because 'C1<char{}, 'a'>' evaluated to false}}
54+
// expected-note@#case1_C1{{because 'sizeof ('\x00') >= 4' (1 >= 4) evaluated to false}}
55+
56+
static_assert(foo<int, 'a'>() == 2);
57+
58+
}
59+
60+
namespace case2 {
61+
template<auto T> concept C1 = sizeof(decltype(T)) >= 0;
62+
template<typename Y> concept C2 = C1<Y{}>;
63+
64+
template<char W>
65+
constexpr int foo() requires C2<int> { return 1; }
66+
67+
template<char X>
68+
constexpr int foo() requires C1<0> && true { return 2; }
69+
70+
static_assert(foo<0>() == 2);
71+
}
72+
73+
namespace case3 {
74+
template<auto T> concept C1 = sizeof(decltype(T)) >= 0;
75+
76+
template<typename Y> concept C2 = C1<Y{}>;
77+
78+
template<char W>
79+
constexpr int foo() requires C2<int> { return 1; } // #case3_foo1
80+
81+
template<char X>
82+
constexpr int foo() requires C1<1> && true { return 2; } // #case3_foo2
83+
84+
static_assert(foo<0>() == 2);
85+
// expected-error@-1{{call to 'foo' is ambiguous}}
86+
// expected-note@#case3_foo1 {{candidate function}}
87+
// expected-note@#case3_foo2 {{candidate function}}
88+
}

0 commit comments

Comments
 (0)