aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2022-11-10 13:01:31 +0100
committerEike Ziller <eike.ziller@qt.io>2022-11-10 13:22:43 +0100
commit10dca6b37f9479396e9907ce53f7affadfbeeb5f (patch)
treebdc57f5ee38d261b6abcc5bd1c9c0dd40ddff305 /src/libs/3rdparty/cplusplus
parentc8fbc0b13c74b446312111a62a8c27a59318507f (diff)
parenta71c0368225c6ef3f0141fdb0f5893da946c0514 (diff)
Merge remote-tracking branch 'origin/9.0'
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp25
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.h1
2 files changed, 24 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp
index 4ad562eb0c..effaac4b65 100644
--- a/src/libs/3rdparty/cplusplus/Bind.cpp
+++ b/src/libs/3rdparty/cplusplus/Bind.cpp
@@ -276,8 +276,25 @@ FullySpecifiedType Bind::postfixDeclarator(PostfixDeclaratorAST *ast, const Full
return value;
}
-bool Bind::preVisit(AST *)
-{
+bool Bind::preVisit(AST *ast)
+{
+ if (_typeWasUnsignedOrSigned) {
+ if (SimpleSpecifierAST *simpleAst = ast->asSimpleSpecifier()) {
+ switch (tokenKind(simpleAst->specifier_token)) {
+ case T_CHAR:
+ case T_CHAR16_T:
+ case T_CHAR32_T:
+ case T_WCHAR_T:
+ case T_INT:
+ case T_SHORT:
+ case T_LONG:
+ _type.setType(&UndefinedType::instance);
+ break;
+ }
+ }
+ _typeWasUnsignedOrSigned = false;
+ }
+
++_depth;
if (_depth > kMaxDepth)
return false;
@@ -2980,13 +2997,17 @@ bool Bind::visit(SimpleSpecifierAST *ast)
case T_SIGNED:
if (_type.isSigned())
translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token));
+ _type.setType(control()->integerType(IntegerType::Int));
_type.setSigned(true);
+ _typeWasUnsignedOrSigned = true;
break;
case T_UNSIGNED:
if (_type.isUnsigned())
translationUnit()->error(ast->specifier_token, "duplicate `%s'", spell(ast->specifier_token));
+ _type.setType(control()->integerType(IntegerType::Int));
_type.setUnsigned(true);
+ _typeWasUnsignedOrSigned = true;
break;
case T_CHAR:
diff --git a/src/libs/3rdparty/cplusplus/Bind.h b/src/libs/3rdparty/cplusplus/Bind.h
index e5ee622881..3947e57026 100644
--- a/src/libs/3rdparty/cplusplus/Bind.h
+++ b/src/libs/3rdparty/cplusplus/Bind.h
@@ -300,6 +300,7 @@ private:
int _methodKey;
bool _skipFunctionBodies;
int _depth;
+ bool _typeWasUnsignedOrSigned = false;
};
} // namespace CPlusPlus