aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus/ResolveExpression.cpp
diff options
context:
space:
mode:
authorVolodymyr Zibarov <gogan419@gmail.com>2020-06-18 15:22:13 +0300
committerVolodymyr Zibarov <gogan419@gmail.com>2020-06-22 14:27:49 +0000
commit40173ad4ab86f0a49d0bb091f654bdf7220931f5 (patch)
treea994dfc4b7cbce205106988b72adab6bc672a587 /src/libs/cplusplus/ResolveExpression.cpp
parenta927c320f728b0902ea5a4ccf120ce35f6972c64 (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.cpp18
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);
+ }
}
}
}