diff options
| author | Richard Smith <richard@metafoo.co.uk> | 2019-10-29 13:06:34 -0700 |
|---|---|---|
| committer | Richard Smith <richard@metafoo.co.uk> | 2019-10-29 13:08:39 -0700 |
| commit | 52590319a225768404591e60803d0bfa84a8b5cd (patch) | |
| tree | c98a5bf4031037ead1cfa3b0f6ced9753c5ca044 | |
| parent | d46c65592e3ac6a78c54514e4919d505c1f0c74a (diff) | |
| download | bcm5719-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.cpp | 6 | ||||
| -rw-r--r-- | clang/test/SemaCXX/overload-member-call.cpp | 7 |
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}} +} + |

