1 //===- unittest/AST/ASTImporterTest.cpp - AST node import test ------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Type-parameterized tests for the correct import of Decls with different
10 // visibility.
11 //
12 //===----------------------------------------------------------------------===//
13
14 // Define this to have ::testing::Combine available.
15 // FIXME: Better solution for this?
16 #define GTEST_HAS_COMBINE 1
17
18 #include "ASTImporterFixtures.h"
19
20 namespace clang {
21 namespace ast_matchers {
22
23 using internal::BindableMatcher;
24
25 // Type parameters for type-parameterized test fixtures.
26 struct GetFunPattern {
27 using DeclTy = FunctionDecl;
operator ()clang::ast_matchers::GetFunPattern28 BindableMatcher<Decl> operator()() { return functionDecl(hasName("f")); }
29 };
30 struct GetVarPattern {
31 using DeclTy = VarDecl;
operator ()clang::ast_matchers::GetVarPattern32 BindableMatcher<Decl> operator()() { return varDecl(hasName("v")); }
33 };
34 struct GetClassPattern {
35 using DeclTy = CXXRecordDecl;
operator ()clang::ast_matchers::GetClassPattern36 BindableMatcher<Decl> operator()() { return cxxRecordDecl(hasName("X")); }
37 };
38 struct GetEnumPattern {
39 using DeclTy = EnumDecl;
operator ()clang::ast_matchers::GetEnumPattern40 BindableMatcher<Decl> operator()() { return enumDecl(hasName("E")); }
41 };
42 struct GetTypedefNamePattern {
43 using DeclTy = TypedefNameDecl;
operator ()clang::ast_matchers::GetTypedefNamePattern44 BindableMatcher<Decl> operator()() { return typedefNameDecl(hasName("T")); }
45 };
46 struct GetFunTemplPattern {
47 using DeclTy = FunctionTemplateDecl;
operator ()clang::ast_matchers::GetFunTemplPattern48 BindableMatcher<Decl> operator()() {
49 return functionTemplateDecl(hasName("f"));
50 }
51 };
52 struct GetVarTemplPattern {
53 using DeclTy = VarTemplateDecl;
operator ()clang::ast_matchers::GetVarTemplPattern54 BindableMatcher<Decl> operator()() {
55 return namedDecl(hasName("v"), has(templateTypeParmDecl()));
56 }
57 };
58 struct GetClassTemplPattern {
59 using DeclTy = ClassTemplateDecl;
operator ()clang::ast_matchers::GetClassTemplPattern60 BindableMatcher<Decl> operator()() { return classTemplateDecl(hasName("X")); }
61 };
62
63 // Values for the value-parameterized test fixtures.
64 // FunctionDecl:
65 const auto *ExternF = "void f();";
66 const auto *StaticF = "static void f();";
67 const auto *AnonF = "namespace { void f(); }";
68 // VarDecl:
69 const auto *ExternV = "extern int v;";
70 const auto *StaticV = "static int v;";
71 const auto *AnonV = "namespace { extern int v; }";
72 // CXXRecordDecl:
73 const auto *ExternC = "class X;";
74 const auto *AnonC = "namespace { class X; }";
75 // EnumDecl:
76 const auto *ExternE = "enum E {};";
77 const auto *AnonE = "namespace { enum E {}; }";
78 const auto *ExternEC = "enum class E;";
79 const auto *AnonEC = "namespace { enum class E; }";
80 // TypedefNameDecl:
81 const auto *ExternTypedef = "typedef int T;";
82 const auto *AnonTypedef = "namespace { typedef int T; }";
83 const auto *ExternUsing = "using T = int;";
84 const auto *AnonUsing = "namespace { using T = int; }";
85 // FunctionTemplateDecl:
86 const auto *ExternFT = "template <class> void f();";
87 const auto *StaticFT = "template <class> static void f();";
88 const auto *AnonFT = "namespace { template <class> void f(); }";
89 // VarTemplateDecl:
90 const auto *ExternVT = "template <class> extern int v;";
91 const auto *StaticVT = "template <class> static int v;";
92 const auto *AnonVT = "namespace { template <class> extern int v; }";
93 // ClassTemplateDecl:
94 const auto *ExternCT = "template <class> class X;";
95 const auto *AnonCT = "namespace { template <class> class X; }";
96
97 // First value in tuple: Compile options.
98 // Second value in tuple: Source code to be used in the test.
99 using ImportVisibilityChainParams = ::testing::WithParamInterface<
100 std::tuple<std::vector<std::string>, const char *>>;
101 // Fixture to test the redecl chain of Decls with the same visibility. Gtest
102 // makes it possible to have either value-parameterized or type-parameterized
103 // fixtures. However, we cannot have both value- and type-parameterized test
104 // fixtures. This is a value-parameterized test fixture in the gtest sense. We
105 // intend to mimic gtest's type-parameters via the PatternFactory template
106 // parameter. We manually instantiate the different tests with the each types.
107 template <typename PatternFactory>
108 class ImportVisibilityChain
109 : public ASTImporterTestBase, public ImportVisibilityChainParams {
110 protected:
111 using DeclTy = typename PatternFactory::DeclTy;
getExtraArgs() const112 std::vector<std::string> getExtraArgs() const override {
113 return std::get<0>(GetParam());
114 }
getCode() const115 std::string getCode() const { return std::get<1>(GetParam()); }
getPattern() const116 BindableMatcher<Decl> getPattern() const { return PatternFactory()(); }
117
118 // Type-parameterized test.
TypedTest_ImportChain()119 void TypedTest_ImportChain() {
120 std::string Code = getCode() + getCode();
121 auto Pattern = getPattern();
122
123 TranslationUnitDecl *FromTu = getTuDecl(Code, Lang_CXX14, "input0.cc");
124
125 auto *FromD0 = FirstDeclMatcher<DeclTy>().match(FromTu, Pattern);
126 auto *FromD1 = LastDeclMatcher<DeclTy>().match(FromTu, Pattern);
127
128 auto *ToD0 = Import(FromD0, Lang_CXX14);
129 auto *ToD1 = Import(FromD1, Lang_CXX14);
130
131 EXPECT_TRUE(ToD0);
132 ASSERT_TRUE(ToD1);
133 EXPECT_NE(ToD0, ToD1);
134 EXPECT_EQ(ToD1->getPreviousDecl(), ToD0);
135 }
136 };
137
138 // Manual instantiation of the fixture with each type.
139 using ImportFunctionsVisibilityChain = ImportVisibilityChain<GetFunPattern>;
140 using ImportVariablesVisibilityChain = ImportVisibilityChain<GetVarPattern>;
141 using ImportClassesVisibilityChain = ImportVisibilityChain<GetClassPattern>;
142 using ImportScopedEnumsVisibilityChain = ImportVisibilityChain<GetEnumPattern>;
143 using ImportFunctionTemplatesVisibilityChain =
144 ImportVisibilityChain<GetFunTemplPattern>;
145 using ImportVariableTemplatesVisibilityChain =
146 ImportVisibilityChain<GetVarTemplPattern>;
147 using ImportClassTemplatesVisibilityChain =
148 ImportVisibilityChain<GetClassTemplPattern>;
149
150 // Value-parameterized test for functions.
TEST_P(ImportFunctionsVisibilityChain,ImportChain)151 TEST_P(ImportFunctionsVisibilityChain, ImportChain) {
152 TypedTest_ImportChain();
153 }
154 // Value-parameterized test for variables.
TEST_P(ImportVariablesVisibilityChain,ImportChain)155 TEST_P(ImportVariablesVisibilityChain, ImportChain) {
156 TypedTest_ImportChain();
157 }
158 // Value-parameterized test for classes.
TEST_P(ImportClassesVisibilityChain,ImportChain)159 TEST_P(ImportClassesVisibilityChain, ImportChain) {
160 TypedTest_ImportChain();
161 }
162 // Value-parameterized test for scoped enums.
TEST_P(ImportScopedEnumsVisibilityChain,ImportChain)163 TEST_P(ImportScopedEnumsVisibilityChain, ImportChain) {
164 TypedTest_ImportChain();
165 }
166 // Value-parameterized test for function templates.
TEST_P(ImportFunctionTemplatesVisibilityChain,ImportChain)167 TEST_P(ImportFunctionTemplatesVisibilityChain, ImportChain) {
168 TypedTest_ImportChain();
169 }
170 // Value-parameterized test for variable templates.
TEST_P(ImportVariableTemplatesVisibilityChain,ImportChain)171 TEST_P(ImportVariableTemplatesVisibilityChain, ImportChain) {
172 TypedTest_ImportChain();
173 }
174 // Value-parameterized test for class templates.
TEST_P(ImportClassTemplatesVisibilityChain,ImportChain)175 TEST_P(ImportClassTemplatesVisibilityChain, ImportChain) {
176 TypedTest_ImportChain();
177 }
178
179 // Automatic instantiation of the value-parameterized tests.
180 INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctionsVisibilityChain,
181 ::testing::Combine(
182 DefaultTestValuesForRunOptions,
183 ::testing::Values(ExternF, StaticF, AnonF)), );
184 INSTANTIATE_TEST_CASE_P(
185 ParameterizedTests, ImportVariablesVisibilityChain,
186 ::testing::Combine(
187 DefaultTestValuesForRunOptions,
188 // There is no point to instantiate with StaticV, because in C++ we can
189 // forward declare a variable only with the 'extern' keyword.
190 // Consequently, each fwd declared variable has external linkage. This
191 // is different in the C language where any declaration without an
192 // initializer is a tentative definition, subsequent definitions may be
193 // provided but they must have the same linkage. See also the test
194 // ImportVariableChainInC which test for this special C Lang case.
195 ::testing::Values(ExternV, AnonV)), );
196 INSTANTIATE_TEST_CASE_P(
197 ParameterizedTests, ImportClassesVisibilityChain,
198 ::testing::Combine(
199 DefaultTestValuesForRunOptions,
200 ::testing::Values(ExternC, AnonC)), );
201 INSTANTIATE_TEST_CASE_P(
202 ParameterizedTests, ImportScopedEnumsVisibilityChain,
203 ::testing::Combine(
204 DefaultTestValuesForRunOptions,
205 ::testing::Values(ExternEC, AnonEC)), );
206 INSTANTIATE_TEST_CASE_P(ParameterizedTests,
207 ImportFunctionTemplatesVisibilityChain,
208 ::testing::Combine(DefaultTestValuesForRunOptions,
209 ::testing::Values(ExternFT, StaticFT,
210 AnonFT)), );
211 INSTANTIATE_TEST_CASE_P(ParameterizedTests,
212 ImportVariableTemplatesVisibilityChain,
213 ::testing::Combine(DefaultTestValuesForRunOptions,
214 ::testing::Values(ExternVT,
215 AnonVT)), );
216 INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportClassTemplatesVisibilityChain,
217 ::testing::Combine(DefaultTestValuesForRunOptions,
218 ::testing::Values(ExternCT,
219 AnonCT)), );
220
221 // First value in tuple: Compile options.
222 // Second value in tuple: Tuple with informations for the test.
223 // Code for first import (or initial code), code to import, whether the `f`
224 // functions are expected to be linked in a declaration chain.
225 // One value of this tuple is combined with every value of compile options.
226 // The test can have a single tuple as parameter only.
227 using ImportVisibilityParams = ::testing::WithParamInterface<std::tuple<
228 std::vector<std::string>, std::tuple<const char *, const char *, bool>>>;
229
230 template <typename PatternFactory>
231 class ImportVisibility
232 : public ASTImporterTestBase,
233 public ImportVisibilityParams {
234 protected:
235 using DeclTy = typename PatternFactory::DeclTy;
getExtraArgs() const236 std::vector<std::string> getExtraArgs() const override {
237 return std::get<0>(GetParam());
238 }
getCode0() const239 std::string getCode0() const { return std::get<0>(std::get<1>(GetParam())); }
getCode1() const240 std::string getCode1() const { return std::get<1>(std::get<1>(GetParam())); }
shouldBeLinked() const241 bool shouldBeLinked() const { return std::get<2>(std::get<1>(GetParam())); }
getPattern() const242 BindableMatcher<Decl> getPattern() const { return PatternFactory()(); }
243
TypedTest_ImportAfter()244 void TypedTest_ImportAfter() {
245 TranslationUnitDecl *ToTu = getToTuDecl(getCode0(), Lang_CXX14);
246 TranslationUnitDecl *FromTu =
247 getTuDecl(getCode1(), Lang_CXX14, "input1.cc");
248
249 auto *ToD0 = FirstDeclMatcher<DeclTy>().match(ToTu, getPattern());
250 auto *FromD1 = FirstDeclMatcher<DeclTy>().match(FromTu, getPattern());
251
252 auto *ToD1 = Import(FromD1, Lang_CXX14);
253
254 ASSERT_TRUE(ToD0);
255 ASSERT_TRUE(ToD1);
256 EXPECT_NE(ToD0, ToD1);
257
258 if (shouldBeLinked())
259 EXPECT_EQ(ToD1->getPreviousDecl(), ToD0);
260 else
261 EXPECT_FALSE(ToD1->getPreviousDecl());
262 }
263
TypedTest_ImportAfterImport()264 void TypedTest_ImportAfterImport() {
265 TranslationUnitDecl *FromTu0 =
266 getTuDecl(getCode0(), Lang_CXX14, "input0.cc");
267 TranslationUnitDecl *FromTu1 =
268 getTuDecl(getCode1(), Lang_CXX14, "input1.cc");
269 auto *FromD0 = FirstDeclMatcher<DeclTy>().match(FromTu0, getPattern());
270 auto *FromD1 = FirstDeclMatcher<DeclTy>().match(FromTu1, getPattern());
271 auto *ToD0 = Import(FromD0, Lang_CXX14);
272 auto *ToD1 = Import(FromD1, Lang_CXX14);
273 ASSERT_TRUE(ToD0);
274 ASSERT_TRUE(ToD1);
275 EXPECT_NE(ToD0, ToD1);
276 if (shouldBeLinked())
277 EXPECT_EQ(ToD1->getPreviousDecl(), ToD0);
278 else
279 EXPECT_FALSE(ToD1->getPreviousDecl());
280 }
281
TypedTest_ImportAfterWithMerge()282 void TypedTest_ImportAfterWithMerge() {
283 TranslationUnitDecl *ToTu = getToTuDecl(getCode0(), Lang_CXX14);
284 TranslationUnitDecl *FromTu =
285 getTuDecl(getCode1(), Lang_CXX14, "input1.cc");
286
287 auto *ToF0 = FirstDeclMatcher<DeclTy>().match(ToTu, getPattern());
288 auto *FromF1 = FirstDeclMatcher<DeclTy>().match(FromTu, getPattern());
289
290 auto *ToF1 = Import(FromF1, Lang_CXX14);
291
292 ASSERT_TRUE(ToF0);
293 ASSERT_TRUE(ToF1);
294
295 if (shouldBeLinked())
296 EXPECT_EQ(ToF0, ToF1);
297 else
298 EXPECT_NE(ToF0, ToF1);
299
300 // We expect no (ODR) warning during the import.
301 EXPECT_EQ(0u, ToTu->getASTContext().getDiagnostics().getNumWarnings());
302 }
303
TypedTest_ImportAfterImportWithMerge()304 void TypedTest_ImportAfterImportWithMerge() {
305 TranslationUnitDecl *FromTu0 =
306 getTuDecl(getCode0(), Lang_CXX14, "input0.cc");
307 TranslationUnitDecl *FromTu1 =
308 getTuDecl(getCode1(), Lang_CXX14, "input1.cc");
309 auto *FromF0 = FirstDeclMatcher<DeclTy>().match(FromTu0, getPattern());
310 auto *FromF1 = FirstDeclMatcher<DeclTy>().match(FromTu1, getPattern());
311 auto *ToF0 = Import(FromF0, Lang_CXX14);
312 auto *ToF1 = Import(FromF1, Lang_CXX14);
313 ASSERT_TRUE(ToF0);
314 ASSERT_TRUE(ToF1);
315 if (shouldBeLinked())
316 EXPECT_EQ(ToF0, ToF1);
317 else
318 EXPECT_NE(ToF0, ToF1);
319
320 // We expect no (ODR) warning during the import.
321 EXPECT_EQ(0u, ToF0->getTranslationUnitDecl()
322 ->getASTContext()
323 .getDiagnostics()
324 .getNumWarnings());
325 }
326 };
327 using ImportFunctionsVisibility = ImportVisibility<GetFunPattern>;
328 using ImportVariablesVisibility = ImportVisibility<GetVarPattern>;
329 using ImportClassesVisibility = ImportVisibility<GetClassPattern>;
330 using ImportEnumsVisibility = ImportVisibility<GetEnumPattern>;
331 using ImportScopedEnumsVisibility = ImportVisibility<GetEnumPattern>;
332 using ImportTypedefNameVisibility = ImportVisibility<GetTypedefNamePattern>;
333 using ImportFunctionTemplatesVisibility = ImportVisibility<GetFunTemplPattern>;
334 using ImportVariableTemplatesVisibility = ImportVisibility<GetVarTemplPattern>;
335 using ImportClassTemplatesVisibility = ImportVisibility<GetClassTemplPattern>;
336
337 // FunctionDecl.
TEST_P(ImportFunctionsVisibility,ImportAfter)338 TEST_P(ImportFunctionsVisibility, ImportAfter) {
339 TypedTest_ImportAfter();
340 }
TEST_P(ImportFunctionsVisibility,ImportAfterImport)341 TEST_P(ImportFunctionsVisibility, ImportAfterImport) {
342 TypedTest_ImportAfterImport();
343 }
344 // VarDecl.
TEST_P(ImportVariablesVisibility,ImportAfter)345 TEST_P(ImportVariablesVisibility, ImportAfter) {
346 TypedTest_ImportAfter();
347 }
TEST_P(ImportVariablesVisibility,ImportAfterImport)348 TEST_P(ImportVariablesVisibility, ImportAfterImport) {
349 TypedTest_ImportAfterImport();
350 }
351 // CXXRecordDecl.
TEST_P(ImportClassesVisibility,ImportAfter)352 TEST_P(ImportClassesVisibility, ImportAfter) {
353 TypedTest_ImportAfter();
354 }
TEST_P(ImportClassesVisibility,ImportAfterImport)355 TEST_P(ImportClassesVisibility, ImportAfterImport) {
356 TypedTest_ImportAfterImport();
357 }
358 // EnumDecl.
TEST_P(ImportEnumsVisibility,ImportAfter)359 TEST_P(ImportEnumsVisibility, ImportAfter) {
360 TypedTest_ImportAfterWithMerge();
361 }
TEST_P(ImportEnumsVisibility,ImportAfterImport)362 TEST_P(ImportEnumsVisibility, ImportAfterImport) {
363 TypedTest_ImportAfterImportWithMerge();
364 }
TEST_P(ImportScopedEnumsVisibility,ImportAfter)365 TEST_P(ImportScopedEnumsVisibility, ImportAfter) {
366 TypedTest_ImportAfter();
367 }
TEST_P(ImportScopedEnumsVisibility,ImportAfterImport)368 TEST_P(ImportScopedEnumsVisibility, ImportAfterImport) {
369 TypedTest_ImportAfterImport();
370 }
371 // TypedefNameDecl.
TEST_P(ImportTypedefNameVisibility,ImportAfter)372 TEST_P(ImportTypedefNameVisibility, ImportAfter) {
373 TypedTest_ImportAfterWithMerge();
374 }
TEST_P(ImportTypedefNameVisibility,ImportAfterImport)375 TEST_P(ImportTypedefNameVisibility, ImportAfterImport) {
376 TypedTest_ImportAfterImportWithMerge();
377 }
378 // FunctionTemplateDecl.
TEST_P(ImportFunctionTemplatesVisibility,ImportAfter)379 TEST_P(ImportFunctionTemplatesVisibility, ImportAfter) {
380 TypedTest_ImportAfter();
381 }
TEST_P(ImportFunctionTemplatesVisibility,ImportAfterImport)382 TEST_P(ImportFunctionTemplatesVisibility, ImportAfterImport) {
383 TypedTest_ImportAfterImport();
384 }
385 // VarTemplateDecl.
TEST_P(ImportVariableTemplatesVisibility,ImportAfter)386 TEST_P(ImportVariableTemplatesVisibility, ImportAfter) {
387 TypedTest_ImportAfter();
388 }
TEST_P(ImportVariableTemplatesVisibility,ImportAfterImport)389 TEST_P(ImportVariableTemplatesVisibility, ImportAfterImport) {
390 TypedTest_ImportAfterImport();
391 }
392 // ClassTemplateDecl.
TEST_P(ImportClassTemplatesVisibility,ImportAfter)393 TEST_P(ImportClassTemplatesVisibility, ImportAfter) { TypedTest_ImportAfter(); }
TEST_P(ImportClassTemplatesVisibility,ImportAfterImport)394 TEST_P(ImportClassTemplatesVisibility, ImportAfterImport) {
395 TypedTest_ImportAfterImport();
396 }
397
398 const bool ExpectLinkedDeclChain = true;
399 const bool ExpectUnlinkedDeclChain = false;
400
401 INSTANTIATE_TEST_CASE_P(
402 ParameterizedTests, ImportFunctionsVisibility,
403 ::testing::Combine(
404 DefaultTestValuesForRunOptions,
405 ::testing::Values(
406 std::make_tuple(ExternF, ExternF, ExpectLinkedDeclChain),
407 std::make_tuple(ExternF, StaticF, ExpectUnlinkedDeclChain),
408 std::make_tuple(ExternF, AnonF, ExpectUnlinkedDeclChain),
409 std::make_tuple(StaticF, ExternF, ExpectUnlinkedDeclChain),
410 std::make_tuple(StaticF, StaticF, ExpectUnlinkedDeclChain),
411 std::make_tuple(StaticF, AnonF, ExpectUnlinkedDeclChain),
412 std::make_tuple(AnonF, ExternF, ExpectUnlinkedDeclChain),
413 std::make_tuple(AnonF, StaticF, ExpectUnlinkedDeclChain),
414 std::make_tuple(AnonF, AnonF, ExpectUnlinkedDeclChain))), );
415 INSTANTIATE_TEST_CASE_P(
416 ParameterizedTests, ImportVariablesVisibility,
417 ::testing::Combine(
418 DefaultTestValuesForRunOptions,
419 ::testing::Values(
420 std::make_tuple(ExternV, ExternV, ExpectLinkedDeclChain),
421 std::make_tuple(ExternV, StaticV, ExpectUnlinkedDeclChain),
422 std::make_tuple(ExternV, AnonV, ExpectUnlinkedDeclChain),
423 std::make_tuple(StaticV, ExternV, ExpectUnlinkedDeclChain),
424 std::make_tuple(StaticV, StaticV, ExpectUnlinkedDeclChain),
425 std::make_tuple(StaticV, AnonV, ExpectUnlinkedDeclChain),
426 std::make_tuple(AnonV, ExternV, ExpectUnlinkedDeclChain),
427 std::make_tuple(AnonV, StaticV, ExpectUnlinkedDeclChain),
428 std::make_tuple(AnonV, AnonV, ExpectUnlinkedDeclChain))), );
429 INSTANTIATE_TEST_CASE_P(
430 ParameterizedTests, ImportClassesVisibility,
431 ::testing::Combine(
432 DefaultTestValuesForRunOptions,
433 ::testing::Values(
434 std::make_tuple(ExternC, ExternC, ExpectLinkedDeclChain),
435 std::make_tuple(ExternC, AnonC, ExpectUnlinkedDeclChain),
436 std::make_tuple(AnonC, ExternC, ExpectUnlinkedDeclChain),
437 std::make_tuple(AnonC, AnonC, ExpectUnlinkedDeclChain))), );
438 INSTANTIATE_TEST_CASE_P(
439 ParameterizedTests, ImportEnumsVisibility,
440 ::testing::Combine(
441 DefaultTestValuesForRunOptions,
442 ::testing::Values(
443 std::make_tuple(ExternE, ExternE, ExpectLinkedDeclChain),
444 std::make_tuple(ExternE, AnonE, ExpectUnlinkedDeclChain),
445 std::make_tuple(AnonE, ExternE, ExpectUnlinkedDeclChain),
446 std::make_tuple(AnonE, AnonE, ExpectUnlinkedDeclChain))), );
447 INSTANTIATE_TEST_CASE_P(
448 ParameterizedTests, ImportScopedEnumsVisibility,
449 ::testing::Combine(
450 DefaultTestValuesForRunOptions,
451 ::testing::Values(
452 std::make_tuple(ExternEC, ExternEC, ExpectLinkedDeclChain),
453 std::make_tuple(ExternEC, AnonEC, ExpectUnlinkedDeclChain),
454 std::make_tuple(AnonEC, ExternEC, ExpectUnlinkedDeclChain),
455 std::make_tuple(AnonEC, AnonEC, ExpectUnlinkedDeclChain))), );
456 INSTANTIATE_TEST_CASE_P(
457 ParameterizedTests, ImportTypedefNameVisibility,
458 ::testing::Combine(
459 DefaultTestValuesForRunOptions,
460 ::testing::Values(
461 std::make_tuple(ExternTypedef, ExternTypedef,
462 ExpectLinkedDeclChain),
463 std::make_tuple(ExternTypedef, AnonTypedef,
464 ExpectUnlinkedDeclChain),
465 std::make_tuple(AnonTypedef, ExternTypedef,
466 ExpectUnlinkedDeclChain),
467 std::make_tuple(AnonTypedef, AnonTypedef, ExpectUnlinkedDeclChain),
468
469 std::make_tuple(ExternUsing, ExternUsing, ExpectLinkedDeclChain),
470 std::make_tuple(ExternUsing, AnonUsing, ExpectUnlinkedDeclChain),
471 std::make_tuple(AnonUsing, ExternUsing, ExpectUnlinkedDeclChain),
472 std::make_tuple(AnonUsing, AnonUsing, ExpectUnlinkedDeclChain),
473
474 std::make_tuple(ExternUsing, ExternTypedef, ExpectLinkedDeclChain),
475 std::make_tuple(ExternUsing, AnonTypedef, ExpectUnlinkedDeclChain),
476 std::make_tuple(AnonUsing, ExternTypedef, ExpectUnlinkedDeclChain),
477 std::make_tuple(AnonUsing, AnonTypedef, ExpectUnlinkedDeclChain),
478
479 std::make_tuple(ExternTypedef, ExternUsing, ExpectLinkedDeclChain),
480 std::make_tuple(ExternTypedef, AnonUsing, ExpectUnlinkedDeclChain),
481 std::make_tuple(AnonTypedef, ExternUsing, ExpectUnlinkedDeclChain),
482 std::make_tuple(AnonTypedef, AnonUsing,
483 ExpectUnlinkedDeclChain))), );
484 INSTANTIATE_TEST_CASE_P(
485 ParameterizedTests, ImportFunctionTemplatesVisibility,
486 ::testing::Combine(
487 DefaultTestValuesForRunOptions,
488 ::testing::Values(
489 std::make_tuple(ExternFT, ExternFT, ExpectLinkedDeclChain),
490 std::make_tuple(ExternFT, StaticFT, ExpectUnlinkedDeclChain),
491 std::make_tuple(ExternFT, AnonFT, ExpectUnlinkedDeclChain),
492 std::make_tuple(StaticFT, ExternFT, ExpectUnlinkedDeclChain),
493 std::make_tuple(StaticFT, StaticFT, ExpectUnlinkedDeclChain),
494 std::make_tuple(StaticFT, AnonFT, ExpectUnlinkedDeclChain),
495 std::make_tuple(AnonFT, ExternFT, ExpectUnlinkedDeclChain),
496 std::make_tuple(AnonFT, StaticFT, ExpectUnlinkedDeclChain),
497 std::make_tuple(AnonFT, AnonFT, ExpectUnlinkedDeclChain))), );
498 INSTANTIATE_TEST_CASE_P(
499 ParameterizedTests, ImportVariableTemplatesVisibility,
500 ::testing::Combine(
501 DefaultTestValuesForRunOptions,
502 ::testing::Values(
503 std::make_tuple(ExternVT, ExternVT, ExpectLinkedDeclChain),
504 std::make_tuple(ExternVT, StaticVT, ExpectUnlinkedDeclChain),
505 std::make_tuple(ExternVT, AnonVT, ExpectUnlinkedDeclChain),
506 std::make_tuple(StaticVT, ExternVT, ExpectUnlinkedDeclChain),
507 std::make_tuple(StaticVT, StaticVT, ExpectUnlinkedDeclChain),
508 std::make_tuple(StaticVT, AnonVT, ExpectUnlinkedDeclChain),
509 std::make_tuple(AnonVT, ExternVT, ExpectUnlinkedDeclChain),
510 std::make_tuple(AnonVT, StaticVT, ExpectUnlinkedDeclChain),
511 std::make_tuple(AnonVT, AnonVT, ExpectUnlinkedDeclChain))), );
512 INSTANTIATE_TEST_CASE_P(
513 ParameterizedTests, ImportClassTemplatesVisibility,
514 ::testing::Combine(
515 DefaultTestValuesForRunOptions,
516 ::testing::Values(std::make_tuple(ExternCT, ExternCT, ExpectLinkedDeclChain),
517 std::make_tuple(ExternCT, AnonCT, ExpectUnlinkedDeclChain),
518 std::make_tuple(AnonCT, ExternCT, ExpectUnlinkedDeclChain),
519 std::make_tuple(AnonCT, AnonCT, ExpectUnlinkedDeclChain))), );
520 } // end namespace ast_matchers
521 } // end namespace clang
522