From a92337ba4700db76f19cc521be04b4ab3e9f2049 Mon Sep 17 00:00:00 2001 From: josetr <37419832+josetr@users.noreply.github.com> Date: Sun, 18 Oct 2020 16:28:12 +0100 Subject: [PATCH] Add support for C++ character literals (u, U, L) (#1434) --- src/CppParser/Parser.cpp | 31 ++++++++++++++++++++++++------- tests/CSharp/CSharp.cpp | 2 +- tests/CSharp/CSharp.h | 2 +- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index ae9a9bf1..79adc076 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -3654,13 +3654,30 @@ AST::ExpressionObsolete* Parser::WalkExpressionObsolete(const clang::Expr* Expr) break; } - clang::Expr::EvalResult integer; - if (Expr->getStmtClass() != clang::Stmt::CharacterLiteralClass && - Expr->getStmtClass() != clang::Stmt::CXXBoolLiteralExprClass && - Expr->getStmtClass() != clang::Stmt::UnaryExprOrTypeTraitExprClass && - !Expr->isValueDependent() && - Expr->EvaluateAsInt(integer, c->getASTContext())) - return new AST::ExpressionObsolete(integer.Val.getInt().toString(10)); + if (!Expr->isValueDependent()) + { + clang::Expr::EvalResult integer; + if (Expr->getStmtClass() == clang::Stmt::CharacterLiteralClass) + { + auto result = GetStringFromStatement(Expr); + if (!result.empty() && + result.front() != '\'' && + Expr->EvaluateAsInt(integer, c->getASTContext())) + { + result = integer.Val.getInt().toString(10); + } + + return new AST::ExpressionObsolete(result); + } + else if (Expr->getStmtClass() != clang::Stmt::CXXBoolLiteralExprClass && + Expr->getStmtClass() != clang::Stmt::UnaryExprOrTypeTraitExprClass && + Expr->EvaluateAsInt(integer, c->getASTContext()) + ) + { + return new AST::ExpressionObsolete(integer.Val.getInt().toString(10)); + } + } + return new AST::ExpressionObsolete(GetStringFromStatement(Expr)); } diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index 9432c7a9..e8b5b8f4 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -638,7 +638,7 @@ void MethodsWithDefaultValues::defaultValueType(QGenericArgument valueType) { } -void MethodsWithDefaultValues::defaultChar(char c) +void MethodsWithDefaultValues::defaultChar(char c, char uc, char Uc, char Lc) { } diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index f01d814a..c0dd100f 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -433,7 +433,7 @@ public: void defaultVoidStar(void* ptr = 0); void defaultFunctionPointer(void(*functionPtr)(int p) = nullptr); void defaultValueType(QGenericArgument valueType = QGenericArgument()); - void defaultChar(char c = 'a'); + void defaultChar(char c = 'a', char uc = u'u', char Uc = U'U', char Lc = L'L'); void defaultEmptyChar(char c = 0); void defaultEmptyEnum(Empty e = Empty(-1)); void defaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2);