Author: Balázs Kéri Date: 2021-03-19T16:33:04+01:00 New Revision: 96e675bdd5c8bfef34135fb50bcc7f570f073639
URL: https://github.com/llvm/llvm-project/commit/96e675bdd5c8bfef34135fb50bcc7f570f073639 DIFF: https://github.com/llvm/llvm-project/commit/96e675bdd5c8bfef34135fb50bcc7f570f073639.diff LOG: [clang][ASTImporter] Add import support for SourceLocExpr. It is possible that imported `SourceLocExpr` can cause not expected behavior (if `__builtin_LINE()` is used together with `__LINE__` for example) but still it may be worth to import these because some projects use it. Reviewed By: teemperor Differential Revision: https://reviews.llvm.org/D98876 Added: Modified: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index d48e173eb3b3..bf3cb4c42873 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -574,6 +574,7 @@ namespace clang { // Importing expressions ExpectedStmt VisitExpr(Expr *E); + ExpectedStmt VisitSourceLocExpr(SourceLocExpr *E); ExpectedStmt VisitVAArgExpr(VAArgExpr *E); ExpectedStmt VisitChooseExpr(ChooseExpr *E); ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E); @@ -6483,6 +6484,21 @@ ExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) { return make_error<ImportError>(ImportError::UnsupportedConstruct); } +ExpectedStmt ASTNodeImporter::VisitSourceLocExpr(SourceLocExpr *E) { + Error Err = Error::success(); + auto BLoc = importChecked(Err, E->getBeginLoc()); + auto RParenLoc = importChecked(Err, E->getEndLoc()); + if (Err) + return std::move(Err); + auto ParentContextOrErr = Importer.ImportContext(E->getParentContext()); + if (!ParentContextOrErr) + return ParentContextOrErr.takeError(); + + return new (Importer.getToContext()) + SourceLocExpr(Importer.getToContext(), E->getIdentKind(), BLoc, RParenLoc, + *ParentContextOrErr); +} + ExpectedStmt ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) { Error Err = Error::success(); diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 43464cc0c9ca..8c4b982ec6d5 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -246,6 +246,24 @@ TEST_P(ImportPath, CycleAfterCycle) { EXPECT_FALSE(path.hasCycleAtBack()); } +const internal::VariadicDynCastAllOfMatcher<Stmt, SourceLocExpr> sourceLocExpr; + +AST_MATCHER_P(SourceLocExpr, hasBuiltinStr, StringRef, Str) { + return Node.getBuiltinStr() == Str; +} + +TEST_P(ImportExpr, ImportSourceLocExpr) { + MatchVerifier<Decl> Verifier; + testImport("void declToImport() { (void)__builtin_FILE(); }", Lang_CXX03, "", + Lang_CXX03, Verifier, + functionDecl(hasDescendant( + sourceLocExpr(hasBuiltinStr("__builtin_FILE"))))); + testImport("void declToImport() { (void)__builtin_COLUMN(); }", Lang_CXX03, + "", Lang_CXX03, Verifier, + functionDecl(hasDescendant( + sourceLocExpr(hasBuiltinStr("__builtin_COLUMN"))))); +} + TEST_P(ImportExpr, ImportStringLiteral) { MatchVerifier<Decl> Verifier; testImport("void declToImport() { (void)\"foo\"; }", Lang_CXX03, "", _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits