diff options
author | Volodymyr Zibarov <gogan419@gmail.com> | 2020-06-18 15:22:13 +0300 |
---|---|---|
committer | Volodymyr Zibarov <gogan419@gmail.com> | 2020-06-22 14:27:49 +0000 |
commit | 40173ad4ab86f0a49d0bb091f654bdf7220931f5 (patch) | |
tree | a994dfc4b7cbce205106988b72adab6bc672a587 /src/libs/cplusplus/ResolveExpression.cpp | |
parent | a927c320f728b0902ea5a4ccf120ce35f6972c64 (diff) |
C++: Fix auto variable resolving for template class constructor call
Code snippet:
template<class T> struct MyStruct { int value; };
int main() {
auto s = MyStruct<int>();
s.value; // "value" is not found
}
This fixes find usages for unique_ptr declared as auto like this:
auto ptr = std::unique_ptr<MyStruct>(new MyStruct());
ptr->value;
Also fixes in-place constructors:
std::unique_ptr<MyStruct>(new MyStruct())->value;
Fixes: QTCREATORBUG-15364
Change-Id: I8d452a77fe85e63665ec8d4c4afbcf8aad063121
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/libs/cplusplus/ResolveExpression.cpp')
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index a2c11b1671e..81b2066634c 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -880,12 +880,18 @@ bool ResolveExpression::visit(CallAST *ast) if (NamedType *namedTy = ty->asNamedType()) { if (ClassOrNamespace *b = _context.lookupType(namedTy->name(), scope)) { - foreach (const LookupItem &r, b->find(functionCallOp)) { - Symbol *overload = r.declaration(); - if (Function *funTy = overload->type()->asFunctionType()) { - if (maybeValidPrototype(funTy, actualArgumentCount)) { - if (Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType()) - addResult(proto->returnType().simplified(), scope); + if (b->templateId() && result.declaration() && result.declaration()->asTemplate()) { + // Template class constructor + addResult(ty.simplified(), scope); + } else { + // operator() + foreach (const LookupItem &r, b->find(functionCallOp)) { + Symbol *overload = r.declaration(); + if (Function *funTy = overload->type()->asFunctionType()) { + if (maybeValidPrototype(funTy, actualArgumentCount)) { + if (Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType()) + addResult(proto->returnType().simplified(), scope); + } } } } |