Browse Source

Add support for C++ character literals (u, U, L) (#1434)

pull/1436/head
josetr 5 years ago committed by GitHub
parent
commit
a92337ba47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 31
      src/CppParser/Parser.cpp
  2. 2
      tests/CSharp/CSharp.cpp
  3. 2
      tests/CSharp/CSharp.h

31
src/CppParser/Parser.cpp

@ -3654,13 +3654,30 @@ AST::ExpressionObsolete* Parser::WalkExpressionObsolete(const clang::Expr* Expr)
break; break;
} }
clang::Expr::EvalResult integer; if (!Expr->isValueDependent())
if (Expr->getStmtClass() != clang::Stmt::CharacterLiteralClass && {
Expr->getStmtClass() != clang::Stmt::CXXBoolLiteralExprClass && clang::Expr::EvalResult integer;
Expr->getStmtClass() != clang::Stmt::UnaryExprOrTypeTraitExprClass && if (Expr->getStmtClass() == clang::Stmt::CharacterLiteralClass)
!Expr->isValueDependent() && {
Expr->EvaluateAsInt(integer, c->getASTContext())) auto result = GetStringFromStatement(Expr);
return new AST::ExpressionObsolete(integer.Val.getInt().toString(10)); 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)); return new AST::ExpressionObsolete(GetStringFromStatement(Expr));
} }

2
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)
{ {
} }

2
tests/CSharp/CSharp.h

@ -433,7 +433,7 @@ public:
void defaultVoidStar(void* ptr = 0); void defaultVoidStar(void* ptr = 0);
void defaultFunctionPointer(void(*functionPtr)(int p) = nullptr); void defaultFunctionPointer(void(*functionPtr)(int p) = nullptr);
void defaultValueType(QGenericArgument valueType = QGenericArgument()); 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 defaultEmptyChar(char c = 0);
void defaultEmptyEnum(Empty e = Empty(-1)); void defaultEmptyEnum(Empty e = Empty(-1));
void defaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2); void defaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2);

Loading…
Cancel
Save