summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard@metafoo.co.uk>2019-10-29 13:06:34 -0700
committerRichard Smith <richard@metafoo.co.uk>2019-10-29 13:08:39 -0700
commit52590319a225768404591e60803d0bfa84a8b5cd (patch)
treec98a5bf4031037ead1cfa3b0f6ced9753c5ca044
parentd46c65592e3ac6a78c54514e4919d505c1f0c74a (diff)
downloadbcm5719-llvm-52590319a225768404591e60803d0bfa84a8b5cd.tar.gz
bcm5719-llvm-52590319a225768404591e60803d0bfa84a8b5cd.zip
Fix argument numbering confusion when diagnosing a non-viable operator().
This could lead to crashes if operator() is a variadic template, as we could end up asking for an out-of-bounds argument.
-rw-r--r--clang/lib/Sema/SemaOverload.cpp6
-rw-r--r--clang/test/SemaCXX/overload-member-call.cpp7
2 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 1547108b4af..2987007f4f2 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -11001,7 +11001,8 @@ CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand,
!isa<CXXConstructorDecl>(Cand->Function)) {
// Conversion 0 is 'this', which doesn't have a corresponding parameter.
ConvIdx = 1;
- if (CSK == OverloadCandidateSet::CSK_Operator)
+ if (CSK == OverloadCandidateSet::CSK_Operator &&
+ Cand->Function->getDeclName().getCXXOverloadedOperator() != OO_Call)
// Argument 0 is 'this', which doesn't have a corresponding parameter.
ArgIdx = 1;
}
@@ -11016,9 +11017,10 @@ CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand,
for (unsigned ParamIdx = Reversed ? ParamTypes.size() - 1 : 0;
ConvIdx != ConvCount;
++ConvIdx, ++ArgIdx, ParamIdx += (Reversed ? -1 : 1)) {
+ assert(ArgIdx < Args.size() && "no argument for this arg conversion");
if (Cand->Conversions[ConvIdx].isInitialized()) {
// We've already checked this conversion.
- } else if (ArgIdx < ParamTypes.size()) {
+ } else if (ParamIdx < ParamTypes.size()) {
if (ParamTypes[ParamIdx]->isDependentType())
Cand->Conversions[ConvIdx].setAsIdentityConversion(
Args[ArgIdx]->getType());
diff --git a/clang/test/SemaCXX/overload-member-call.cpp b/clang/test/SemaCXX/overload-member-call.cpp
index 41f3946de0b..90f95fc916e 100644
--- a/clang/test/SemaCXX/overload-member-call.cpp
+++ b/clang/test/SemaCXX/overload-member-call.cpp
@@ -114,3 +114,10 @@ namespace b7398190 {
const S *p;
int k = p->f(); // expected-error {{no matching member function for call to 'f'}}
}
+
+void member_call_op_template(int *p) {
+ // Ensure that we don't get confused about relative parameter / argument
+ // indexing here.
+ [](int, int, auto...){}(p, p); // expected-error {{no matching function}} expected-note {{no known conversion}}
+}
+
OpenPOWER on IntegriCloud