eduucaldas updated this revision to Diff 276770.
eduucaldas added a comment.

Add support for integer and floating UDL even for raw literal operator and 
numeric literal operator template


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82157/new/

https://reviews.llvm.org/D82157

Files:
  clang/include/clang/AST/Expr.h
  clang/include/clang/Tooling/Syntax/Nodes.h
  clang/lib/Tooling/Syntax/BuildTree.cpp
  clang/lib/Tooling/Syntax/Nodes.cpp
  clang/unittests/Tooling/Syntax/TreeTest.cpp

Index: clang/unittests/Tooling/Syntax/TreeTest.cpp
===================================================================
--- clang/unittests/Tooling/Syntax/TreeTest.cpp
+++ 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
     | `-;
     `-}
Index: clang/lib/Tooling/Syntax/Nodes.cpp
===================================================================
--- clang/lib/Tooling/Syntax/Nodes.cpp
+++ 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:
Index: clang/lib/Tooling/Syntax/BuildTree.cpp
===================================================================
--- clang/lib/Tooling/Syntax/BuildTree.cpp
+++ 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<BuildTreeVisitor> {
 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
 
Index: clang/include/clang/Tooling/Syntax/Nodes.h
===================================================================
--- clang/include/clang/Tooling/Syntax/Nodes.h
+++ 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 {
Index: clang/include/clang/AST/Expr.h
===================================================================
--- clang/include/clang/AST/Expr.h
+++ 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;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to