@@ -10181,6 +10181,111 @@ TEST_P(ImportTemplateParmDeclDefaultValue,
10181
10181
FromD, FromDInherited);
10182
10182
}
10183
10183
10184
+ TEST_P (ASTImporterOptionSpecificTestBase,
10185
+ ExistingUndeclaredImportDeclaredFriend) {
10186
+ Decl *ToTU = getToTuDecl (
10187
+ R"(
10188
+ template <class A, A>
10189
+ struct foo;
10190
+
10191
+ template <class A>
10192
+ struct X {
10193
+ template <class A1, A1>
10194
+ friend struct foo;
10195
+ };
10196
+ )" ,
10197
+ Lang_CXX11);
10198
+ Decl *FromTU = getTuDecl (
10199
+ R"(
10200
+ template <class A, A>
10201
+ struct foo;
10202
+
10203
+ template <class A>
10204
+ struct X {
10205
+ template <class A1, A1>
10206
+ friend struct foo;
10207
+ };
10208
+
10209
+ X<int> x;
10210
+ )" ,
10211
+ Lang_CXX11);
10212
+
10213
+ auto *ToFr1 = FirstDeclMatcher<FriendDecl>().match (ToTU, friendDecl ());
10214
+ auto *ToFrD1 = ToFr1->getFriendDecl ();
10215
+
10216
+ auto *FromFr1 = FirstDeclMatcher<FriendDecl>().match (FromTU, friendDecl ());
10217
+ auto *FromFr2 = LastDeclMatcher<FriendDecl>().match (FromTU, friendDecl ());
10218
+
10219
+ auto *FromFrD1 = FromFr1->getFriendDecl ();
10220
+ auto *FromFrD2 = FromFr2->getFriendDecl ();
10221
+
10222
+ auto *Ctx1 = cast<Decl>(FromFrD1->getDeclContext ());
10223
+ auto *Ctx2 = cast<Decl>(FromFrD2->getDeclContext ());
10224
+
10225
+ ASSERT_EQ (Ctx1, Ctx2);
10226
+ ASSERT_EQ (ToFrD1->getTemplateDepth (), 1u );
10227
+ ASSERT_EQ (FromFrD2->getTemplateDepth (), 0u );
10228
+ ASSERT_EQ (ToFrD1->getFriendObjectKind (), Decl::FOK_Undeclared);
10229
+ ASSERT_EQ (FromFrD2->getFriendObjectKind (), Decl::FOK_Declared);
10230
+
10231
+ auto *ToFr2Imp = Import (FromFr2, Lang_CXX11);
10232
+
10233
+ EXPECT_TRUE (ToFr2Imp);
10234
+ }
10235
+
10236
+ TEST_P (ASTImporterOptionSpecificTestBase,
10237
+ ExistingDeclaredImportUndeclaredFriend) {
10238
+ Decl *ToTU = getToTuDecl (
10239
+ R"(
10240
+ template <class A, A>
10241
+ struct foo;
10242
+
10243
+ template <class A>
10244
+ struct X {
10245
+ template <class A1, A1>
10246
+ friend struct foo;
10247
+ };
10248
+
10249
+ X<int> x;
10250
+ )" ,
10251
+ Lang_CXX11);
10252
+ Decl *FromTU = getTuDecl (
10253
+ R"(
10254
+ template <class A, A>
10255
+ struct foo;
10256
+
10257
+ template <class A>
10258
+ struct X {
10259
+ template <class A1, A1>
10260
+ friend struct foo;
10261
+ };
10262
+ )" ,
10263
+ Lang_CXX11);
10264
+
10265
+ auto *ToFr1 = FirstDeclMatcher<FriendDecl>().match (ToTU, friendDecl ());
10266
+ auto *ToFr2 = LastDeclMatcher<FriendDecl>().match (ToTU, friendDecl ());
10267
+
10268
+ auto *ToFrD1 = ToFr1->getFriendDecl ();
10269
+ auto *ToFrD2 = ToFr2->getFriendDecl ();
10270
+
10271
+ auto *FromFr1 = FirstDeclMatcher<FriendDecl>().match (FromTU, friendDecl ());
10272
+ auto *FromFrD1 = FromFr1->getFriendDecl ();
10273
+
10274
+ auto *Ctx1 = cast<Decl>(ToFrD1->getDeclContext ());
10275
+ auto *Ctx2 = cast<Decl>(ToFrD2->getDeclContext ());
10276
+
10277
+ ASSERT_EQ (Ctx1, Ctx2);
10278
+ ASSERT_EQ (FromFrD1->getTemplateDepth (), 1u );
10279
+ ASSERT_EQ (ToFrD2->getTemplateDepth (), 0u );
10280
+ ASSERT_EQ (FromFrD1->getFriendObjectKind (), Decl::FOK_Undeclared);
10281
+ ASSERT_EQ (ToFrD2->getFriendObjectKind (), Decl::FOK_Declared);
10282
+
10283
+ auto *ToFr1Imp = Import (FromFr1, Lang_CXX11);
10284
+
10285
+ EXPECT_TRUE (ToFr1Imp);
10286
+ EXPECT_EQ (ToFr1Imp, ToFr1);
10287
+ }
10288
+
10184
10289
INSTANTIATE_TEST_SUITE_P (ParameterizedTests, ASTImporterLookupTableTest,
10185
10290
DefaultTestValuesForRunOptions);
10186
10291
0 commit comments