forked from qt-creator/qt-creator
clangbackend: Categorize non-const pointer arguments as output arguments
Fixes: QTCREATORBUG-24550 Change-Id: Iac4f3b133a632d7272bfe4253f8a0740e51b0952 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user