diff options
author | Eike Ziller <eike.ziller@qt.io> | 2022-11-10 13:01:31 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2022-11-10 13:22:43 +0100 |
commit | 10dca6b37f9479396e9907ce53f7affadfbeeb5f (patch) | |
tree | bdc57f5ee38d261b6abcc5bd1c9c0dd40ddff305 /src/libs/3rdparty/cplusplus | |
parent | c8fbc0b13c74b446312111a62a8c27a59318507f (diff) | |
parent | a71c0368225c6ef3f0141fdb0f5893da946c0514 (diff) |
Merge remote-tracking branch 'origin/9.0'
Change-Id: Ie069f3b2a1200b3e665341b1d56ce836024b0d29
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 25 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.h | 1 |
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 |