INSTANTIATE_TEST_CASE_P(ParameterizedTests, CanonicalRedeclChain,
::testing::Values(ArgVector()), );
+TEST_P(ASTImporterOptionSpecificTestBase, LambdasAreDifferentiated) {
+ Decl *FromTU = getTuDecl(
+ R"(
+ void f() {
+ auto L0 = [](){};
+ auto L1 = [](){};
+ }
+ )",
+ Lang_CXX11, "input0.cc");
+ auto Pattern = lambdaExpr();
+ CXXRecordDecl *FromL0 =
+ FirstDeclMatcher<LambdaExpr>().match(FromTU, Pattern)->getLambdaClass();
+ CXXRecordDecl *FromL1 =
+ LastDeclMatcher<LambdaExpr>().match(FromTU, Pattern)->getLambdaClass();
+ ASSERT_NE(FromL0, FromL1);
+
+ CXXRecordDecl *ToL0 = Import(FromL0, Lang_CXX11);
+ CXXRecordDecl *ToL1 = Import(FromL1, Lang_CXX11);
+ EXPECT_NE(ToL0, ToL1);
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase,
+ LambdasInFunctionParamsAreDifferentiated) {
+ Decl *FromTU = getTuDecl(
+ R"(
+ template <typename F0, typename F1>
+ void f(F0 L0 = [](){}, F1 L1 = [](){}) {}
+ )",
+ Lang_CXX11, "input0.cc");
+ auto Pattern = cxxRecordDecl(isLambda());
+ CXXRecordDecl *FromL0 =
+ FirstDeclMatcher<CXXRecordDecl>().match(FromTU, Pattern);
+ CXXRecordDecl *FromL1 =
+ LastDeclMatcher<CXXRecordDecl>().match(FromTU, Pattern);
+ ASSERT_NE(FromL0, FromL1);
+
+ CXXRecordDecl *ToL0 = Import(FromL0, Lang_CXX11);
+ CXXRecordDecl *ToL1 = Import(FromL1, Lang_CXX11);
+ ASSERT_NE(ToL0, ToL1);
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase,
+ LambdasInFunctionParamsAreDifferentiatedWhenMacroIsUsed) {
+ Decl *FromTU = getTuDecl(
+ R"(
+ #define LAMBDA [](){}
+ template <typename F0, typename F1>
+ void f(F0 L0 = LAMBDA, F1 L1 = LAMBDA) {}
+ )",
+ Lang_CXX11, "input0.cc");
+ auto Pattern = cxxRecordDecl(isLambda());
+ CXXRecordDecl *FromL0 =
+ FirstDeclMatcher<CXXRecordDecl>().match(FromTU, Pattern);
+ CXXRecordDecl *FromL1 =
+ LastDeclMatcher<CXXRecordDecl>().match(FromTU, Pattern);
+ ASSERT_NE(FromL0, FromL1);
+
+ Import(FromL0, Lang_CXX11);
+ Import(FromL1, Lang_CXX11);
+ CXXRecordDecl *ToL0 = Import(FromL0, Lang_CXX11);
+ CXXRecordDecl *ToL1 = Import(FromL1, Lang_CXX11);
+ ASSERT_NE(ToL0, ToL1);
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase, ImportAssignedLambda) {
+ Decl *FromTU = getTuDecl(
+ R"(
+ void f() {
+ auto x = []{} = {}; auto x2 = x;
+ }
+ )",
+ Lang_CXX2a, "input0.cc");
+ auto FromF = FirstDeclMatcher<FunctionDecl>().match(
+ FromTU, functionDecl(hasName("f")));
+ // We have only one lambda class.
+ ASSERT_EQ(
+ DeclCounter<CXXRecordDecl>().match(FromTU, cxxRecordDecl(isLambda())),
+ 1u);
+
+ FunctionDecl *ToF = Import(FromF, Lang_CXX2a);
+ EXPECT_TRUE(ToF);
+ TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+ // We have only one lambda class after the import.
+ EXPECT_EQ(DeclCounter<CXXRecordDecl>().match(ToTU, cxxRecordDecl(isLambda())),
+ 1u);
+}
+
+TEST_P(ASTImporterOptionSpecificTestBase, ImportDefaultConstructibleLambdas) {
+ Decl *FromTU = getTuDecl(
+ R"(
+ void f() {
+ auto x = []{} = {};
+ auto xb = []{} = {};
+ }
+ )",
+ Lang_CXX2a, "input0.cc");
+ auto FromF = FirstDeclMatcher<FunctionDecl>().match(
+ FromTU, functionDecl(hasName("f")));
+ // We have two lambda classes.
+ ASSERT_EQ(
+ DeclCounter<CXXRecordDecl>().match(FromTU, cxxRecordDecl(isLambda())),
+ 2u);
+
+ FunctionDecl *ToF = Import(FromF, Lang_CXX2a);
+ EXPECT_TRUE(ToF);
+ TranslationUnitDecl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
+ // We have two lambda classes after the import.
+ EXPECT_EQ(DeclCounter<CXXRecordDecl>().match(ToTU, cxxRecordDecl(isLambda())),
+ 2u);
+}
+
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions, );