balazske created this revision. Herald added subscribers: martong, teemperor, gamesh411, Szelethus, dkrupp. Herald added a reviewer: a.sidorin. Herald added a reviewer: shafik. balazske requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D98876 Files: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -246,6 +246,24 @@ 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, "", Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -574,6 +574,7 @@ // Importing expressions ExpectedStmt VisitExpr(Expr *E); + ExpectedStmt VisitSourceLocExpr(SourceLocExpr *E); ExpectedStmt VisitVAArgExpr(VAArgExpr *E); ExpectedStmt VisitChooseExpr(ChooseExpr *E); ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E); @@ -6482,6 +6483,21 @@ 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();
Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -246,6 +246,24 @@ 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, "", Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -574,6 +574,7 @@ // Importing expressions ExpectedStmt VisitExpr(Expr *E); + ExpectedStmt VisitSourceLocExpr(SourceLocExpr *E); ExpectedStmt VisitVAArgExpr(VAArgExpr *E); ExpectedStmt VisitChooseExpr(ChooseExpr *E); ExpectedStmt VisitGNUNullExpr(GNUNullExpr *E); @@ -6482,6 +6483,21 @@ 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();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits