diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -2999,7 +2999,6 @@ SourceLocation getBeginLoc() const LLVM_READONLY; SourceLocation getEndLoc() const LLVM_READONLY; - /// Return true if this is a call to __assume() or __builtin_assume() with /// a non-value-dependent constant parameter evaluating as false. bool isBuiltinAssumeFalse(const ASTContext &Ctx) const; diff --git a/clang/include/clang/Tooling/Syntax/Nodes.h b/clang/include/clang/Tooling/Syntax/Nodes.h --- a/clang/include/clang/Tooling/Syntax/Nodes.h +++ b/clang/include/clang/Tooling/Syntax/Nodes.h @@ -50,7 +50,6 @@ StringLiteralExpression, BoolLiteralExpression, CxxNullPtrExpression, - UnknownUserDefinedLiteralExpression, IntegerUserDefinedLiteralExpression, FloatUserDefinedLiteralExpression, CharUserDefinedLiteralExpression, @@ -340,8 +339,7 @@ public: UserDefinedLiteralExpression(NodeKind K) : Expression(K) {} static bool classof(const Node *N) { - return N->kind() == NodeKind::UnknownUserDefinedLiteralExpression || - N->kind() == NodeKind::IntegerUserDefinedLiteralExpression || + return N->kind() == NodeKind::IntegerUserDefinedLiteralExpression || N->kind() == NodeKind::FloatUserDefinedLiteralExpression || N->kind() == NodeKind::CharUserDefinedLiteralExpression || N->kind() == NodeKind::StringUserDefinedLiteralExpression; @@ -349,21 +347,6 @@ syntax::Leaf *literalToken(); }; -// We cannot yet distinguish between user-defined-integer-literal and -// user-defined-floating-point-literal, when using raw literal operator or -// numeric literal operator. C++ [lex.ext]p3, p4 -/// Expression for an unknown user-defined-literal. -class UnknownUserDefinedLiteralExpression final - : public UserDefinedLiteralExpression { -public: - UnknownUserDefinedLiteralExpression() - : UserDefinedLiteralExpression( - NodeKind::UnknownUserDefinedLiteralExpression) {} - static bool classof(const Node *N) { - return N->kind() == NodeKind::UnknownUserDefinedLiteralExpression; - } -}; - /// Expression for user-defined-integer-literal. C++ [lex.ext] class IntegerUserDefinedLiteralExpression final : public UserDefinedLiteralExpression { diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -23,6 +23,7 @@ #include "clang/Basic/Specifiers.h" #include "clang/Basic/TokenKinds.h" #include "clang/Lex/Lexer.h" +#include "clang/Lex/LiteralSupport.h" #include "clang/Tooling/Syntax/Nodes.h" #include "clang/Tooling/Syntax/Tokens.h" #include "clang/Tooling/Syntax/Tree.h" @@ -552,8 +553,8 @@ namespace { class BuildTreeVisitor : public RecursiveASTVisitor { public: - explicit BuildTreeVisitor(ASTContext &Ctx, syntax::TreeBuilder &Builder) - : Builder(Builder), LangOpts(Ctx.getLangOpts()) {} + explicit BuildTreeVisitor(ASTContext &Context, syntax::TreeBuilder &Builder) + : Builder(Builder), Context(Context) {} bool shouldTraversePostOrder() const { return true; } @@ -730,9 +731,19 @@ return syntax::NodeKind::StringUserDefinedLiteralExpression; case clang::UserDefinedLiteral::LOK_Raw: case clang::UserDefinedLiteral::LOK_Template: - // FIXME: Apply `NumericLiteralParser` to the underlying token to deduce - // the right UDL kind. That would require a `Preprocessor` though. - return syntax::NodeKind::UnknownUserDefinedLiteralExpression; + auto TokLoc = S->getBeginLoc(); + auto TokSpelling = + Builder.findToken(TokLoc)->text(Context.getSourceManager()); + auto Literal = NumericLiteralParser{TokSpelling, + TokLoc, + Context.getSourceManager(), + Context.getLangOpts(), + Context.getTargetInfo(), + Context.getDiagnostics()}; + if (Literal.isIntegerLiteral()) + return syntax::NodeKind::IntegerUserDefinedLiteralExpression; + else + return syntax::NodeKind::FloatUserDefinedLiteralExpression; } } @@ -1262,7 +1273,7 @@ llvm::BumpPtrAllocator &allocator() { return Builder.allocator(); } syntax::TreeBuilder &Builder; - const LangOptions &LangOpts; + const ASTContext &Context; }; } // namespace diff --git a/clang/lib/Tooling/Syntax/Nodes.cpp b/clang/lib/Tooling/Syntax/Nodes.cpp --- a/clang/lib/Tooling/Syntax/Nodes.cpp +++ b/clang/lib/Tooling/Syntax/Nodes.cpp @@ -32,8 +32,6 @@ return OS << "BoolLiteralExpression"; case NodeKind::CxxNullPtrExpression: return OS << "CxxNullPtrExpression"; - case NodeKind::UnknownUserDefinedLiteralExpression: - return OS << "UnknownUserDefinedLiteralExpression"; case NodeKind::IntegerUserDefinedLiteralExpression: return OS << "IntegerUserDefinedLiteralExpression"; case NodeKind::FloatUserDefinedLiteralExpression: diff --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp --- a/clang/unittests/Tooling/Syntax/TreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -1204,9 +1204,6 @@ 1.2_f; // call: operator "" _f(1.2L) | kind: float '2'_c; // call: operator "" _c('2') | kind: char - // TODO: Generate `FloatUserDefinedLiteralExpression` and - // `IntegerUserDefinedLiteralExpression` instead of - // `UnknownUserDefinedLiteralExpression`. See `getUserDefinedLiteralKind` 12_r; // call: operator "" _r("12") | kind: integer 1.2_r; // call: operator "" _i("1.2") | kind: float 12_t; // call: operator<'1', '2'> "" _x() | kind: integer @@ -1308,19 +1305,19 @@ | | `-'2'_c | `-; |-ExpressionStatement - | |-UnknownUserDefinedLiteralExpression + | |-IntegerUserDefinedLiteralExpression | | `-12_r | `-; |-ExpressionStatement - | |-UnknownUserDefinedLiteralExpression + | |-FloatUserDefinedLiteralExpression | | `-1.2_r | `-; |-ExpressionStatement - | |-UnknownUserDefinedLiteralExpression + | |-IntegerUserDefinedLiteralExpression | | `-12_t | `-; |-ExpressionStatement - | |-UnknownUserDefinedLiteralExpression + | |-FloatUserDefinedLiteralExpression | | `-1.2_t | `-; `-}