From ed292f3f9b59c23114f27a562a131a145bd67d82 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 14 Oct 2020 14:12:30 +0200 Subject: [PATCH] clangbackend: Categorize non-const pointer arguments as output arguments Fixes: QTCREATORBUG-24550 Change-Id: Iac4f3b133a632d7272bfe4253f8a0740e51b0952 Reviewed-by: Christian Stenger --- src/tools/clangbackend/source/clangtype.cpp | 13 ++++++++++++- tests/unit/unittest/cursor-test.cpp | 10 +++++----- tests/unit/unittest/tokenprocessor-test.cpp | 6 +++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/tools/clangbackend/source/clangtype.cpp b/src/tools/clangbackend/source/clangtype.cpp index af58f715959..9f9b8830e94 100644 --- a/src/tools/clangbackend/source/clangtype.cpp +++ b/src/tools/clangbackend/source/clangtype.cpp @@ -76,7 +76,18 @@ bool Type::isReferencingConstant() const bool Type::isOutputArgument() const { - return isLValueReference() && !pointeeType().isConstant(); + if (isLValueReference() && !pointeeType().isConstant()) + return true; + + // We consider a pointer an output argument if it is non-const at any level. + // This is consistent with how we categorize references in CppTools. + Type t = *this; + while (t.isPointer()) { + t = t.pointeeType(); + if (!t.isConstant()) + return true; + } + return false; } bool Type::isBuiltinType() const diff --git a/tests/unit/unittest/cursor-test.cpp b/tests/unit/unittest/cursor-test.cpp index 2fa4bff7098..521002f3d22 100644 --- a/tests/unit/unittest/cursor-test.cpp +++ b/tests/unit/unittest/cursor-test.cpp @@ -489,7 +489,7 @@ TEST_F(Cursor, HasOutputValues) auto outputArgumentLocations = callExpressionCursor.outputArgumentRanges(); - ASSERT_THAT(outputArgumentLocations.size(), 1); + ASSERT_THAT(outputArgumentLocations.size(), 2); ASSERT_THAT(outputArgumentLocations[0], outputArgumentExpectedSourceLocation); } @@ -744,13 +744,13 @@ TEST_F(Cursor, PointerIsNotRefencingConstant) ASSERT_FALSE(argument.isReferencingConstant()); } -TEST_F(Cursor, PointerIsNotOutputArgument) +TEST_F(Cursor, PointerIsOutputArgument) { auto callExpressionCursor = translationUnit.cursorAt(127, 13); auto argument = callExpressionCursor.type().argument(0); - ASSERT_FALSE(argument.isOutputArgument()); + ASSERT_TRUE(argument.isOutputArgument()); } TEST_F(Cursor, ConstantReferenceIsNotOutputArgument) @@ -771,13 +771,13 @@ TEST_F(Cursor, PointerToConstantIsNotOutputArgument) ASSERT_FALSE(argument.isOutputArgument()) << argument.isConstant() << argument.pointeeType().isConstant(); } -TEST_F(Cursor, ConstantPointerIsNotOutputArgument) +TEST_F(Cursor, ConstantPointerIsOutputArgument) { auto callExpressionCursor = translationUnit.cursorAt(128, 21); auto argument = callExpressionCursor.type().argument(0); - ASSERT_FALSE(argument.isOutputArgument()); + ASSERT_TRUE(argument.isOutputArgument()); } TEST_F(Cursor, ReferenceIsOutputArgument) diff --git a/tests/unit/unittest/tokenprocessor-test.cpp b/tests/unit/unittest/tokenprocessor-test.cpp index 37c76d8ce6d..f74fb0dbedd 100644 --- a/tests/unit/unittest/tokenprocessor-test.cpp +++ b/tests/unit/unittest/tokenprocessor-test.cpp @@ -1326,7 +1326,7 @@ TEST_F(TokenProcessor, NonConstPointerArgument) infos[1]; ASSERT_THAT(infos[2], - HasOnlyType(HighlightingType::LocalVariable)); + HasTwoTypes(HighlightingType::LocalVariable, HighlightingType::OutputArgument)); } TEST_F(TokenProcessor, PointerToConstArgument) @@ -1346,7 +1346,7 @@ TEST_F(TokenProcessor, ConstPointerArgument) infos[1]; ASSERT_THAT(infos[2], - HasOnlyType(HighlightingType::LocalVariable)); + HasTwoTypes(HighlightingType::LocalVariable, HighlightingType::OutputArgument)); } TEST_F(TokenProcessor, NonConstPointerGetterAsArgument) @@ -1400,7 +1400,7 @@ TEST_F(TokenProcessor, NonConstPointerArgumentAsExpression) infos[1]; ASSERT_THAT(infos[3], - HasOnlyType(HighlightingType::LocalVariable)); + HasTwoTypes(HighlightingType::LocalVariable, HighlightingType::OutputArgument)); } TEST_F(TokenProcessor, NonConstPointerArgumentAsInstanceWithMember)