diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -2271,6 +2271,10 @@ extern const internal::VariadicDynCastAllOfMatcher imaginaryLiteral; +/// Matches fixed point literals +extern const internal::VariadicDynCastAllOfMatcher + fixedPointLiteral; + /// Matches user defined literal operator call. /// /// Example match: "foo"_suffix diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -588,6 +588,7 @@ ExpectedStmt VisitIntegerLiteral(IntegerLiteral *E); ExpectedStmt VisitFloatingLiteral(FloatingLiteral *E); ExpectedStmt VisitImaginaryLiteral(ImaginaryLiteral *E); + ExpectedStmt VisitFixedPointLiteral(FixedPointLiteral *E); ExpectedStmt VisitCharacterLiteral(CharacterLiteral *E); ExpectedStmt VisitStringLiteral(StringLiteral *E); ExpectedStmt VisitCompoundLiteralExpr(CompoundLiteralExpr *E); @@ -6503,6 +6504,20 @@ *ToSubExprOrErr, *ToTypeOrErr); } +ExpectedStmt ASTNodeImporter::VisitFixedPointLiteral(FixedPointLiteral *E) { + auto ToTypeOrErr = import(E->getType()); + if (!ToTypeOrErr) + return ToTypeOrErr.takeError(); + + ExpectedSLoc ToLocationOrErr = import(E->getLocation()); + if (!ToLocationOrErr) + return ToLocationOrErr.takeError(); + + return new (Importer.getToContext()) FixedPointLiteral( + Importer.getToContext(), E->getValue(), *ToTypeOrErr, *ToLocationOrErr, + Importer.getToContext().getFixedPointScale(*ToTypeOrErr)); +} + ExpectedStmt ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { ExpectedType ToTypeOrErr = import(E->getType()); if (!ToTypeOrErr) diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -804,6 +804,8 @@ integerLiteral; const internal::VariadicDynCastAllOfMatcher floatLiteral; const internal::VariadicDynCastAllOfMatcher imaginaryLiteral; +const internal::VariadicDynCastAllOfMatcher + fixedPointLiteral; const internal::VariadicDynCastAllOfMatcher userDefinedLiteral; const internal::VariadicDynCastAllOfMatcher diff --git a/clang/unittests/AST/ASTImporterFixtures.h b/clang/unittests/AST/ASTImporterFixtures.h --- a/clang/unittests/AST/ASTImporterFixtures.h +++ b/clang/unittests/AST/ASTImporterFixtures.h @@ -66,10 +66,13 @@ } }; -const auto DefaultTestValuesForRunOptions = ::testing::Values( +const auto DefaultTestArrayForRunOptions = std::array{ ArgVector(), ArgVector{"-fdelayed-template-parsing"}, ArgVector{"-fms-compatibility"}, - ArgVector{"-fdelayed-template-parsing", "-fms-compatibility"}); + ArgVector{"-fdelayed-template-parsing", "-fms-compatibility"}}; + +const auto DefaultTestValuesForRunOptions = + ::testing::ValuesIn(DefaultTestArrayForRunOptions); // This class provides generic methods to write tests which can check internal // attributes of AST nodes like getPreviousDecl(), isVirtual(), etc. Also, diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -255,6 +255,7 @@ struct ImportExpr : TestImportBase {}; struct ImportType : TestImportBase {}; struct ImportDecl : TestImportBase {}; +struct ImportFixedPointExpr : ImportExpr {}; struct CanonicalRedeclChain : ASTImporterOptionSpecificTestBase {}; @@ -527,6 +528,14 @@ floatLiteral(equals(1.0e-5f), hasType(asString("float")))))); } +TEST_P(ImportFixedPointExpr, ImportFixedPointerLiteralExpr) { + MatchVerifier Verifier; + testImport("void declToImport() { (void)1.0k; }", Lang_C, "", Lang_C, + Verifier, functionDecl(hasDescendant(fixedPointLiteral()))); + testImport("void declToImport() { (void)0.75r; }", Lang_C, "", Lang_C, + Verifier, functionDecl(hasDescendant(fixedPointLiteral()))); +} + TEST_P(ImportExpr, ImportImaginaryLiteralExpr) { MatchVerifier Verifier; testImport( @@ -5922,6 +5931,17 @@ EXPECT_TRUE(ToA); } +template +auto ExtendWithOptions(const T &Values, const ArgVector &Args) { + auto Copy = Values; + for (ArgVector &ArgV : Copy) { + for (const std::string &Arg : Args) { + ArgV.push_back(Arg); + } + } + return ::testing::ValuesIn(Copy); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, ); @@ -5931,6 +5951,10 @@ INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportExpr, DefaultTestValuesForRunOptions, ); +INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFixedPointExpr, + ExtendWithOptions(DefaultTestArrayForRunOptions, + ArgVector{"-ffixed-point"}), ); + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportType, DefaultTestValuesForRunOptions, );