[PATCH] D82157: Fix crash on `user defined literals`
This revision was automatically updated to reflect the committed changes. Closed by commit rGf33c2c27a8d4: Fix crash on `user defined literals` (authored by eduucaldas). Changed prior to commit: https://reviews.llvm.org/D82157?vs=277060&id=277071#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,20 +1184,108 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); + +unsigned operator "" _r(const char*); // raw-literal operator + +template +unsigned operator "" _t();// numeric literal operator template + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1296,95 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-UnknownUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-UnknownUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_t +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, UserDefinedLiteralString) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +typedef decltype(sizeof(void *)) size_t; +unsigned operator "" _s(const char*, size_t); +void test() { + "12"_s;// call: operator "" _s("12") | kind: string +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +|
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 277060. eduucaldas marked an inline comment as done. eduucaldas added a comment. Add assert Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,20 +1184,139 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +typedef decltype(sizeof(void *)) size_t; + +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); +unsigned operator "" _s(const char*, size_t); +unsigned operator "" _r(const char*); +template +unsigned operator "" _t(); + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 1.2_f; // call: operator "" _f(1.2L) | kind: float + '2'_c; // call: operator "" _c('2')| kind: char + "12"_s; // call: operator "" _s("12") | kind: string + + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | |-, +| | |-SimpleDeclaration +| | | `-size_t +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1327,36 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-StringUserDefinedLiteralExpression +| | `-"12"_s | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-IntegerUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-FloatUserDefinedLiteralExpression +| | `-1.2_r +| `-; +|-ExpressionStatement +| |-IntegerUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-FloatUserDefinedLiteralExpression +| | `-1.2_t | `-; `-} )txt")); Index: clang/lib/Tooling/Syntax/Nodes.cpp === --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -32,6 +32,14 @@ return OS << "BoolLiteralExpression"; case NodeKind::CxxNullPtrExpression: return OS << "CxxNullPtrExpression";
[PATCH] D82157: Fix crash on `user defined literals`
gribozavr2 accepted this revision. gribozavr2 added inline comments. This revision is now accepted and ready to land. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:749 + else +return new (allocator()) syntax::FloatUserDefinedLiteralExpression; +} `... else { assert(Literal.isFloatingLiteral()); return new ... }` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276960. eduucaldas added a comment. - Add comment explaining complication on LOK_Raw and LOK_Template - Use FileRange::text instead of Lexer::getSpelling Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,20 +1184,139 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +typedef decltype(sizeof(void *)) size_t; + +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); +unsigned operator "" _s(const char*, size_t); +unsigned operator "" _r(const char*); +template +unsigned operator "" _t(); + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 1.2_f; // call: operator "" _f(1.2L) | kind: float + '2'_c; // call: operator "" _c('2')| kind: char + "12"_s; // call: operator "" _s("12") | kind: string + + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | |-, +| | |-SimpleDeclaration +| | | `-size_t +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1327,36 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-StringUserDefinedLiteralExpression +| | `-"12"_s | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-IntegerUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-FloatUserDefinedLiteralExpression +| | `-1.2_r +| `-; +|-ExpressionStatement +| |-IntegerUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-FloatUserDefinedLiteralExpression +| | `-1.2_t | `-; `-} )txt")); Index: clang/lib/Tooling/Syntax/Nodes.cpp === --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -32,6 +32,14 @@ return OS << "BoolLiteralExpression"; case NodeKind::C
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas marked 2 inline comments as done. eduucaldas added inline comments. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:723 + syntax::UserDefinedLiteralExpression * + buildUserDefinedLiteral(UserDefinedLiteral *S) { +switch (S->getLiteralOperatorKind()) { b or B? Should I use camelCase or TitleCase? Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:735-751 + auto TokLoc = S->getBeginLoc(); + auto buffer = SmallVector(); + bool invalidSpelling = false; + auto TokSpelling = + Lexer::getSpelling(TokLoc, buffer, Context.getSourceManager(), + Context.getLangOpts(), &invalidSpelling); + assert(!invalidSpelling); I'll write a comment explaining why this crazyness. Promise not to rant about the lexer that doesn't distinguish between float and integer. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:738-740 + auto TokSpelling = + Lexer::getSpelling(TokLoc, buffer, Context.getSourceManager(), + Context.getLangOpts(), &invalidSpelling); This is exactly the function used by the parser to get the `TokSpelling`. see: llvm-project/clang/lib/Sema/SemaExpr.cpp:3633 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas added inline comments. Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1210 + 12_t; // call: operator<'1', '2'> "" _x() | kind: integer + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } gribozavr2 wrote: > call -> calls? (as in, "this expression calls ...") it is a noun here, as kind is. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276919. eduucaldas marked 9 inline comments as done. eduucaldas added a comment. Use right function to get TokSpelling, answer comments Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,20 +1184,139 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +typedef decltype(sizeof(void *)) size_t; + +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); +unsigned operator "" _s(const char*, size_t); +unsigned operator "" _r(const char*); +template +unsigned operator "" _t(); + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 1.2_f; // call: operator "" _f(1.2L) | kind: float + '2'_c; // call: operator "" _c('2')| kind: char + "12"_s; // call: operator "" _s("12") | kind: string + + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | |-, +| | |-SimpleDeclaration +| | | `-size_t +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1327,36 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-StringUserDefinedLiteralExpression +| | `-"12"_s | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-IntegerUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-FloatUserDefinedLiteralExpression +| | `-1.2_r +| `-; +|-ExpressionStatement +| |-IntegerUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-FloatUserDefinedLiteralExpression +| | `-1.2_t | `-; `-} )txt")); Index: clang/lib/Tooling/Syntax/Nodes.cpp === --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -32,6 +32,14 @@ return OS << "BoolLiteralExpression"; case NodeKind::CxxNullPtrExpressio
[PATCH] D82157: Fix crash on `user defined literals`
gribozavr2 added inline comments. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:737 + Builder.findToken(TokLoc)->text(Context.getSourceManager()); + auto Literal = NumericLiteralParser{TokSpelling, + TokLoc, Please use parentheses to call the constructor. Braces are correct, but not idiomatic in LLVM. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:754 + new (allocator()) syntax::UserDefinedLiteralExpression( + getUserDefinedLiteralKind(S)), + S); Please allocate an instance of the correct derived type. It is undefined behavior to downcast an object allocated as `UserDefinedLiteralExpression` to any of its subtypes. Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1197 + +unsigned operator "" _r(const char*); // raw-literal operator + No need to explain the language. Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1200 +template +unsigned operator "" _t();// numeric literal operator template + No need to explain the language. Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1210 + 12_t; // call: operator<'1', '2'> "" _x() | kind: integer + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } call -> calls? (as in, "this expression calls ...") Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1333 + R"cpp( +typedef decltype(sizeof(void *)) size_t; +unsigned operator "" _s(const char*, size_t); I don't understand why this test is separate from the previous one -- why not merge them all into one, or split all of them into one call per test? Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1336 +void test() { + "12"_s;// call: operator "" _s("12") | kind: string +} ditto, "calls" Also please add a space before "//". Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276772. eduucaldas added a comment. Nothing Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,20 +1184,105 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); + +unsigned operator "" _r(const char*); // raw-literal operator + +template +unsigned operator "" _t();// numeric literal operator template + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 1.2_f; // call: operator "" _f(1.2L) | kind: float + '2'_c; // call: operator "" _c('2')| kind: char + + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1293,95 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-IntegerUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-FloatUserDefinedLiteralExpression +| | `-1.2_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-IntegerUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-FloatUserDefinedLiteralExpression +| | `-1.2_t +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, UserDefinedLiteralString) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +typedef decltype(sizeof(void *)) size_t; +unsigned operator "" _s(const char*, size_t); +void test() { + "12"_s;// call: operator "" _s("12") | kind: string +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | |-, +| | |-SimpleDeclaration +| | | `-size_t +| | `-) +| `-; +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-Strin
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas marked an inline comment as done. eduucaldas added inline comments. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:736 + auto TokSpelling = + Builder.findToken(TokLoc)->text(Context.getSourceManager()); + auto Literal = NumericLiteralParser{TokSpelling, Not sure if text is the right thing to get a `TokenSpelling` from a `syntax::Token` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276771. eduucaldas added a comment. nothing Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 { 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, IntegerUserDefined
[PATCH] D82157: Fix crash on `user defined literals`
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 { 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 @@ St
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276681. eduucaldas added a comment. Document proposed solution for treating raw literal operators and numeric template operators Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,20 +1184,108 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); + +unsigned operator "" _r(const char*); // raw-literal operator + +template +unsigned operator "" _t();// numeric literal operator template + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1296,95 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-UnknownUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-UnknownUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_t +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, UserDefinedLiteralString) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +typedef decltype(sizeof(void *)) size_t; +unsigned operator "" _s(const char*, size_t); +void test() { + "12"_s;// call: operator "" _s("12") | kind: string +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarat
[PATCH] D82157: Fix crash on `user defined literals`
gribozavr2 added inline comments. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:634 +// `SourceLocation`s. As a result one of these nodes has a valid +// `SourceLocation` that doesn't point to a token. +// eduucaldas wrote: > gribozavr2 wrote: > > "The semantic AST node for has child nodes that reference two source > > locations, the location of the beginning of the token (`1`), and the > > location of the beginning of the UDL suffix (`_`). The UDL suffix location > > does not point to the beginning of a token, so we can't represent the UDL > > suffix as a separate syntax tree node." > I changed your comment slightly, WDYT LGTM! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276678. eduucaldas added a comment. Polishing patch Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,20 +1184,106 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); + +unsigned operator "" _r(const char*); // raw-literal operator + +template +unsigned operator "" _t();// numeric literal operator template + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 1.2_f; // call: operator "" _f(1.2L) | kind: float + '2'_c; // call: operator "" _c('2')| kind: char + + // PROBLEM: How to discover the kind of user-defined-literal from the AST? + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1294,95 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-UnknownUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-UnknownUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_t +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, UserDefinedLiteralString) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +typedef decltype(sizeof(void *)) size_t; +unsigned operator "" _s(const char*, size_t); +void test() { + "12"_s;// call: operator "" _s("12") | kind: string +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | |-, +| | |-SimpleDeclaration +| | | `-size_t +| | `-) +| `-; +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + |
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas added inline comments. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:634 +// `SourceLocation`s. As a result one of these nodes has a valid +// `SourceLocation` that doesn't point to a token. +// gribozavr2 wrote: > "The semantic AST node for has child nodes that reference two source > locations, the location of the beginning of the token (`1`), and the location > of the beginning of the UDL suffix (`_`). The UDL suffix location does not > point to the beginning of a token, so we can't represent the UDL suffix as a > separate syntax tree node." I changed your comment slightly, WDYT Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas marked 4 inline comments as done. eduucaldas added inline comments. Comment at: clang/include/clang/Tooling/Syntax/Nodes.h:347-357 +/// Expression for an unkonwn user-defined literal. C++ [lex.ext] +class UnknownUserDefinedLiteralExpression final +: public UserDefinedLiteralExpression { +public: + UnknownUserDefinedLiteralExpression() + : UserDefinedLiteralExpression( +NodeKind::UnknownUserDefinedLiteralExpression) {} This is gonna be removed once we are able to distinguish between integer and float on raw and template UDL Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:218-219 auto InitializerEnd = Initializer.getEnd(); -assert(SM.isBeforeInTranslationUnit(End, InitializerEnd) || End == InitializerEnd); +assert(SM.isBeforeInTranslationUnit(End, InitializerEnd) || + End == InitializerEnd); End = InitializerEnd; I know it adds noise, but this is the only place where the formatting doesn't obey the llvm clang format. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:732 +case clang::UserDefinedLiteral::LOK_Template: + return syntax::NodeKind::UnknownUserDefinedLiteralExpression; +} Here we need logic to determine which kind of UDL, if float or integer Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1309-1310 |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-UnknownUserDefinedLiteralExpression +| | `-12_r | `-; For raw and template UDL, we don't know yet how to get the information about integer of float Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276638. eduucaldas added a comment. workaround size_t Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: clang/include/clang/Testing/TestClangConfig.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 @@ -1184,20 +1184,106 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); + +unsigned operator "" _r(const char*); // raw-literal operator + +template +unsigned operator "" _t();// numeric literal operator template + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 1.2_f; // call: operator "" _f(1.2L) | kind: float + '2'_c; // call: operator "" _c('2')| kind: char + + // PROBLEM: How to discover the kind of user-defined-literal from the AST? + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1294,95 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-UnknownUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-UnknownUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_t +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, UserDefinedLiteralString) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +typedef decltype(sizeof(void *)) size_t; +unsigned operator "" _s(const char*, size_t); +void test() { + "12"_s;// call: operator "" _s("12") | kind: string +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-typedef +| |-decltype +| |-( +| |-UnknownExpression +| | |-sizeof +| | |-( +| | |-void +| | |-* +| | `-) +| |-) +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | |-, +| | |-SimpleDeclaration +| | | `-size_t +| | `-) +| `-; +`-SimpleDeclaration + |-void + |-SimpleDeclarato
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276637. eduucaldas marked 4 inline comments as done. eduucaldas added a comment. Add support for {Integer,Float,Char,String}UserDefinedLiteral Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: clang/include/clang/Testing/TestClangConfig.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 @@ -1184,20 +1184,106 @@ )txt")); } -TEST_P(SyntaxTreeTest, IntegerLiteral) { +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } EXPECT_TRUE(treeDumpEqual( R"cpp( +unsigned operator "" _i(unsigned long long); +unsigned operator "" _f(long double); +unsigned operator "" _c(char); + +unsigned operator "" _r(const char*); // raw-literal operator + +template +unsigned operator "" _t();// numeric literal operator template + void test() { - 12; - 12u; - 12l; - 12ul; - 014; - 0XC; + 12_i; // call: operator "" _i(12uLL) | kind: integer + 1.2_f; // call: operator "" _f(1.2L) | kind: float + '2'_c; // call: operator "" _c('2')| kind: char + + // PROBLEM: How to discover the kind of user-defined-literal from the AST? + 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 + 1.2_t; // call: operator<'1', '2'> "" _x() | kind: float } -)cpp", +)cpp", R"txt( *: TranslationUnit +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_i +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-unsigned +| | | |-long +| | | `-long +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_f +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_c +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | `-char +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_r +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_t +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; `-SimpleDeclaration |-void |-SimpleDeclarator @@ -1208,28 +1294,93 @@ `-CompoundStatement |-{ |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12 +| |-IntegerUserDefinedLiteralExpression +| | `-12_i | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12u +| |-FloatUserDefinedLiteralExpression +| | `-1.2_f | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12l +| |-CharUserDefinedLiteralExpression +| | `-'2'_c | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-12ul +| |-UnknownUserDefinedLiteralExpression +| | `-12_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-014 +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_r | `-; |-ExpressionStatement -| |-IntegerLiteralExpression -| | `-0XC +| |-UnknownUserDefinedLiteralExpression +| | `-12_t +| `-; +|-ExpressionStatement +| |-UnknownUserDefinedLiteralExpression +| | `-1.2_t +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, UserDefinedLiteralString) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +typedef __SIZE_TYPE__ size_t; +unsigned operator "" _s(const char*, size_t); +void test() { + "12"_s;// call: operator "" _s("12") | kind: string +} +)cpp", + std::string(R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-typedef)txt") + + (!GetParam().isLinux() ? R"txt( +| |-I: long)txt" + : "") + + R"txt( +| |-I: long +| |-I: unsigned +| |-I: int +| |-SimpleDeclarator +| | `-size_t +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_s +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas marked 2 inline comments as done. eduucaldas added inline comments. Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1265 +| |-UserDefinedLiteralExpression +| | `-12_w +| `-; gribozavr2 wrote: > It looks somewhat weird to me that integer and floating point literals end up > with the same syntax tree node type. WDYT about making different nodes for > different literals (integer, floating-point, string, character)? Makes sense. Let's follow the [[ https://eel.is/c++draft/lex.ext#nt:user-defined-literal | grammar ]] then. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
gribozavr2 added a comment. > Fix crash on `user defined literals` WDYT: Implement support for user defined literals (which also fixes a crash) > Given an UserDefinedLiteral 1.2_w: > Problem: Lexer generates one Token for the literal, but ClangAST > references two source locations > Fix: Ignore the operator and interpret it as the underlying literal. > e.g.: 1.2_w token generates syntax node IntegerLiteral(1.2_w) WDYT: A user defined literal (for example, `1.2_w`) is one token. The Clang AST for a user defined literal references two source locations: the beginning of the token (the location of `1` in `1.2_w`) and the beginning of the suffix (the location of `_`). When constructing the syntax tree, we were trying to find a token that starts at the underscore, but couldn't find one, and crashed on an assertion failure. To fix this issue, we ignore the Clang AST nodes for UDLs that have source locations that point in the middle of a token. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:634 +// `SourceLocation`s. As a result one of these nodes has a valid +// `SourceLocation` that doesn't point to a token. +// "The semantic AST node for has child nodes that reference two source locations, the location of the beginning of the token (`1`), and the location of the beginning of the UDL suffix (`_`). The UDL suffix location does not point to the beginning of a token, so we can't represent the UDL suffix as a separate syntax tree node." Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1197-1199 +1.2_w; // calls operator "" _w(1.2L) +12_w; // calls operator "" _w("12") +12_x; // calls operator<'1', '2'> "" _x() Indent -2. Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1200 +12_x; // calls operator<'1', '2'> "" _x() +} +)cpp", Could you also add tests for user-defined string literals and user-defined character literals? ("abc"_mystr, u"abc"_mystr, 'c'_mychar) Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1265 +| |-UserDefinedLiteralExpression +| | `-12_w +| `-; It looks somewhat weird to me that integer and floating point literals end up with the same syntax tree node type. WDYT about making different nodes for different literals (integer, floating-point, string, character)? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 276361. eduucaldas added a comment. Reflect fix on RecursiveASTVisitor Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: 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 @@ -1184,6 +1184,93 @@ )txt")); } +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +long double operator "" _w(long double); +unsigned operator "" _w(const char*); +template unsigned operator "" _x(); +int main() { +1.2_w; // calls operator "" _w(1.2L) +12_w; // calls operator "" _w("12") +12_x; // calls operator<'1', '2'> "" _x() +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-long +| |-double +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_w +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_w +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_x +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; +`-SimpleDeclaration + |-int + |-SimpleDeclarator + | |-main + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-UserDefinedLiteralExpression +| | `-1.2_w +| `-; +|-ExpressionStatement +| |-UserDefinedLiteralExpression +| | `-12_w +| `-; +|-ExpressionStatement +| |-UserDefinedLiteralExpression +| | `-12_x +| `-; +`-} +)txt")); +} TEST_P(SyntaxTreeTest, IntegerLiteral) { EXPECT_TRUE(treeDumpEqual( R"cpp( Index: clang/lib/Tooling/Syntax/Nodes.cpp === --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -32,6 +32,8 @@ return OS << "BoolLiteralExpression"; case NodeKind::CxxNullPtrExpression: return OS << "CxxNullPtrExpression"; + case NodeKind::UserDefinedLiteralExpression: +return OS << "UserDefinedLiteralExpression"; case NodeKind::PrefixUnaryOperatorExpression: return OS << "PrefixUnaryOperatorExpression"; case NodeKind::PostfixUnaryOperatorExpression: @@ -252,6 +254,11 @@ findChild(syntax::NodeRole::LiteralToken)); } +syntax::Leaf *syntax::UserDefinedLiteralExpression::literalToken() { + return llvm::cast_or_null( + findChild(syntax::NodeRole::LiteralToken)); +} + syntax::Expression *syntax::BinaryOperatorExpression::lhs() { return llvm::cast_or_null( findChild(syntax::NodeRole::BinaryOperatorExpression_leftHandSide)); Index: clang/lib/Tooling/Syntax/BuildTree.cpp === --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -627,6 +627,26 @@ return NNS; } + bool TraverseUserDefinedLiteral(UserDefinedLiteral *S) { +// The user-defined literal `1.2_w` corresponds to *one* token. The semantic +// node for it however may have two children nodes, both with valid +// `SourceLocation`s. As a result one of these nodes has a valid +// `SourceLocation` that doesn't point to a token. +// +// If we traverse the children of a user-defined literal, we then arrive to +// a semantic node that doesn't have a token, and that breaks an invariant +// of the syntax tree. For that reason we skip traversing user-defined +// literal children. + +return WalkUpFromUserDefinedLiteral(S); + } + + bool WalkUpFromUserDefinedLiteral(UserDefinedLiteral *S) { +Builder.markChildToken(S->getBeginLoc(), syntax::NodeRole::LiteralToken); +Builder.foldNode(Builder.getExprRange(S), + new (allocator()) syntax::UserDefinedLiteralExpression, S); +return true; + } bool WalkUpFromDeclRefExpr(DeclRefExpr *S) { if (auto *NNS = BuildNestedNameSpecifier(S->getQualifierLoc())) Builder.markChild(NNS, syntax::NodeRole::IdExpression_qualifier); Index: clang/include/clang/Tooling/Syntax/Nodes.h === --- clang/include/clang/Tooling/Syntax/Nodes.h +++ clang/include/clang/Tooling/Syn
[PATCH] D82157: Fix crash on `user defined literals`
gribozavr2 added inline comments. Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:632 +// As a node is built by folding tokens we cannot generate one +// for `_w` +Builder.markChildToken(S->getBeginLoc(), syntax::NodeRole::LiteralToken); This comment makes sense, but it is not clear how it is connected to the implementation. Could you clarify? Also, could you re-wrap the comment to 80 columns? Where exactly in the AST do we have the source location that points to `_w`? What are we doing to avoid using that source location? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas updated this revision to Diff 271980. eduucaldas added a comment. Why does this work? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82157/new/ https://reviews.llvm.org/D82157 Files: clang/lib/Tooling/Syntax/BuildTree.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 @@ -1228,6 +1228,93 @@ )txt")); } +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +long double operator "" _w(long double); +unsigned operator "" _w(const char*); +template unsigned operator "" _x(); +int main() { +1.2_w; // calls operator "" _w(1.2L) +12_w; // calls operator "" _w("12") +12_x; // calls operator<'1', '2'> "" _x() +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-long +| |-double +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_w +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_w +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_x +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; +`-SimpleDeclaration + |-int + |-SimpleDeclarator + | |-main + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-UserDefinedLiteralExpression +| | `-1.2_w +| `-; +|-ExpressionStatement +| |-UserDefinedLiteralExpression +| | `-12_w +| `-; +|-ExpressionStatement +| |-UserDefinedLiteralExpression +| | `-12_x +| `-; +`-} +)txt")); +} TEST_P(SyntaxTreeTest, IntegerLiteral) { EXPECT_TRUE(treeDumpEqual( R"cpp( Index: clang/lib/Tooling/Syntax/BuildTree.cpp === --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -623,6 +623,19 @@ return NNS; } + bool TraverseUserDefinedLiteral(UserDefinedLiteral *S) { return true; } + + bool WalkUpFromUserDefinedLiteral(UserDefinedLiteral *S) { +// The user-defined-literal `1.2_w` is not split in the tokens `1.2` and +// `_w` as we might imagine, its tokens are `1.2_w` only. +// As a node is built by folding tokens we cannot generate one +// for `_w` +Builder.markChildToken(S->getBeginLoc(), syntax::NodeRole::LiteralToken); +Builder.foldNode(Builder.getExprRange(S), + new (allocator()) syntax::IntegerLiteralExpression, S); +return true; + } + bool WalkUpFromDeclRefExpr(DeclRefExpr *S) { if (auto *NNS = BuildNestedNameSpecifier(S->getQualifierLoc())) Builder.markChild(NNS, syntax::NodeRole::IdExpression_qualifier); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82157: Fix crash on `user defined literals`
eduucaldas created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Given an UserDefinedLiteral `1.2_w`: Problem: Lexer generates one Token for the literal, but ClangAST references two source locations Fix: Ignore the operator and interpret it as the underlying literal. e.g.: `1.2_w` token generates syntax node IntegerLiteral(1.2_w) Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D82157 Files: clang/lib/Tooling/Syntax/BuildTree.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 @@ -1228,6 +1228,95 @@ )txt")); } +TEST_P(SyntaxTreeTest, UserDefinedLiteral) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +long double operator "" _w(long double); +unsigned operator "" _w(const char*); +template unsigned operator "" _x(); +int main() { +1.2_w; // calls operator "" _w(1.2L) +12_w; // calls operator "" _w("12") +12_x; // calls operator<'1', '2'> "" _x() +} +)cpp", + R"txt( +*: TranslationUnit +|-SimpleDeclaration +| |-long +| |-double +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_w +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-long +| | | `-double +| | `-) +| `-; +|-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_w +| | `-ParametersAndQualifiers +| | |-( +| | |-SimpleDeclaration +| | | |-const +| | | |-char +| | | `-SimpleDeclarator +| | | `-* +| | `-) +| `-; +|-TemplateDeclaration +| |-template +| |-< +| |-SimpleDeclaration +| | `-char +| |-... +| |-> +| `-SimpleDeclaration +| |-unsigned +| |-SimpleDeclarator +| | |-operator +| | |-"" +| | |-_x +| | `-ParametersAndQualifiers +| | |-( +| | `-) +| `-; +`-SimpleDeclaration + |-int + |-SimpleDeclarator + | |-main + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-UnknownExpression +| | `-UnknownExpression +| | `-1.2_w +| `-; +|-ExpressionStatement +| |-UnknownExpression +| | `-UnknownExpression +| | `-12_w +| `-; +|-ExpressionStatement +| |-UnknownExpression +| | `-12_x +| `-; +`-} +)txt")); +} TEST_P(SyntaxTreeTest, IntegerLiteral) { EXPECT_TRUE(treeDumpEqual( R"cpp( Index: clang/lib/Tooling/Syntax/BuildTree.cpp === --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -624,6 +624,9 @@ } bool WalkUpFromDeclRefExpr(DeclRefExpr *S) { +if (S->getNameInfo().getName().getNameKind() == +clang::DeclarationName::CXXLiteralOperatorName) + return true; if (auto *NNS = BuildNestedNameSpecifier(S->getQualifierLoc())) Builder.markChild(NNS, syntax::NodeRole::IdExpression_qualifier); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits