ASTImporterGenericRedeclTest.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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 redecl chains.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "ASTImporterFixtures.h"
  13. namespace clang {
  14. namespace ast_matchers {
  15. using internal::BindableMatcher;
  16. struct Function {
  17. using DeclTy = FunctionDecl;
  18. static constexpr auto *Prototype = "void X();";
  19. static constexpr auto *Definition = "void X() {}";
  20. BindableMatcher<Decl> getPattern() {
  21. return functionDecl(hasName("X"), unless(isImplicit()));
  22. }
  23. };
  24. struct Class {
  25. using DeclTy = CXXRecordDecl;
  26. static constexpr auto *Prototype = "class X;";
  27. static constexpr auto *Definition = "class X {};";
  28. BindableMatcher<Decl> getPattern() {
  29. return cxxRecordDecl(hasName("X"), unless(isImplicit()));
  30. }
  31. };
  32. struct Variable {
  33. using DeclTy = VarDecl;
  34. static constexpr auto *Prototype = "extern int X;";
  35. static constexpr auto *Definition = "int X;";
  36. BindableMatcher<Decl> getPattern() { return varDecl(hasName("X")); }
  37. };
  38. struct FunctionTemplate {
  39. using DeclTy = FunctionTemplateDecl;
  40. static constexpr auto *Prototype = "template <class T> void X();";
  41. static constexpr auto *Definition =
  42. R"(
  43. template <class T> void X() {};
  44. // Explicit instantiation is a must because of -fdelayed-template-parsing:
  45. template void X<int>();
  46. )";
  47. BindableMatcher<Decl> getPattern() {
  48. return functionTemplateDecl(hasName("X"), unless(isImplicit()));
  49. }
  50. };
  51. struct ClassTemplate {
  52. using DeclTy = ClassTemplateDecl;
  53. static constexpr auto *Prototype = "template <class T> class X;";
  54. static constexpr auto *Definition = "template <class T> class X {};";
  55. BindableMatcher<Decl> getPattern() {
  56. return classTemplateDecl(hasName("X"), unless(isImplicit()));
  57. }
  58. };
  59. struct FunctionTemplateSpec {
  60. using DeclTy = FunctionDecl;
  61. static constexpr auto *Prototype =
  62. R"(
  63. // Proto of the primary template.
  64. template <class T>
  65. void X();
  66. // Proto of the specialization.
  67. template <>
  68. void X<int>();
  69. )";
  70. static constexpr auto *Definition =
  71. R"(
  72. // Proto of the primary template.
  73. template <class T>
  74. void X();
  75. // Specialization and definition.
  76. template <>
  77. void X<int>() {}
  78. )";
  79. BindableMatcher<Decl> getPattern() {
  80. return functionDecl(hasName("X"), isExplicitTemplateSpecialization());
  81. }
  82. };
  83. struct ClassTemplateSpec {
  84. using DeclTy = ClassTemplateSpecializationDecl;
  85. static constexpr auto *Prototype =
  86. R"(
  87. template <class T> class X;
  88. template <> class X<int>;
  89. )";
  90. static constexpr auto *Definition =
  91. R"(
  92. template <class T> class X;
  93. template <> class X<int> {};
  94. )";
  95. BindableMatcher<Decl> getPattern() {
  96. return classTemplateSpecializationDecl(hasName("X"), unless(isImplicit()));
  97. }
  98. };
  99. template <typename TypeParam>
  100. struct RedeclChain : ASTImporterOptionSpecificTestBase {
  101. using DeclTy = typename TypeParam::DeclTy;
  102. std::string getPrototype() { return TypeParam::Prototype; }
  103. std::string getDefinition() { return TypeParam::Definition; }
  104. BindableMatcher<Decl> getPattern() const { return TypeParam().getPattern(); }
  105. void CheckPreviousDecl(Decl *Prev, Decl *Current) {
  106. ASSERT_NE(Prev, Current);
  107. ASSERT_EQ(&Prev->getASTContext(), &Current->getASTContext());
  108. EXPECT_EQ(Prev->getCanonicalDecl(), Current->getCanonicalDecl());
  109. // Templates.
  110. if (auto *PrevT = dyn_cast<TemplateDecl>(Prev)) {
  111. EXPECT_EQ(Current->getPreviousDecl(), Prev);
  112. auto *CurrentT = cast<TemplateDecl>(Current);
  113. ASSERT_TRUE(PrevT->getTemplatedDecl());
  114. ASSERT_TRUE(CurrentT->getTemplatedDecl());
  115. EXPECT_EQ(CurrentT->getTemplatedDecl()->getPreviousDecl(),
  116. PrevT->getTemplatedDecl());
  117. return;
  118. }
  119. // Specializations.
  120. if (auto *PrevF = dyn_cast<FunctionDecl>(Prev)) {
  121. if (PrevF->getTemplatedKind() ==
  122. FunctionDecl::TK_FunctionTemplateSpecialization) {
  123. // There may be a hidden fwd spec decl before a spec decl.
  124. // In that case the previous visible decl can be reached through that
  125. // invisible one.
  126. EXPECT_THAT(Prev, testing::AnyOf(
  127. Current->getPreviousDecl(),
  128. Current->getPreviousDecl()->getPreviousDecl()));
  129. auto *ToTU = Prev->getTranslationUnitDecl();
  130. auto *TemplateD = FirstDeclMatcher<FunctionTemplateDecl>().match(
  131. ToTU, functionTemplateDecl());
  132. auto *FirstSpecD = *(TemplateD->spec_begin());
  133. EXPECT_EQ(FirstSpecD->getCanonicalDecl(), PrevF->getCanonicalDecl());
  134. return;
  135. }
  136. }
  137. // The rest: Classes, Functions, etc.
  138. EXPECT_EQ(Current->getPreviousDecl(), Prev);
  139. }
  140. void
  141. TypedTest_PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition() {
  142. Decl *FromTU = getTuDecl(getPrototype(), Lang_CXX);
  143. auto *FromD = FirstDeclMatcher<DeclTy>().match(FromTU, getPattern());
  144. ASSERT_FALSE(FromD->isThisDeclarationADefinition());
  145. Decl *ImportedD = Import(FromD, Lang_CXX);
  146. Decl *ToTU = ImportedD->getTranslationUnitDecl();
  147. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 1u);
  148. auto *ToD = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  149. EXPECT_TRUE(ImportedD == ToD);
  150. EXPECT_FALSE(ToD->isThisDeclarationADefinition());
  151. if (auto *ToT = dyn_cast<TemplateDecl>(ToD)) {
  152. EXPECT_TRUE(ToT->getTemplatedDecl());
  153. }
  154. }
  155. void TypedTest_DefinitionShouldBeImportedAsADefinition() {
  156. Decl *FromTU = getTuDecl(getDefinition(), Lang_CXX);
  157. auto *FromD = FirstDeclMatcher<DeclTy>().match(FromTU, getPattern());
  158. ASSERT_TRUE(FromD->isThisDeclarationADefinition());
  159. Decl *ImportedD = Import(FromD, Lang_CXX);
  160. Decl *ToTU = ImportedD->getTranslationUnitDecl();
  161. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 1u);
  162. auto *ToD = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  163. EXPECT_TRUE(ToD->isThisDeclarationADefinition());
  164. if (auto *ToT = dyn_cast<TemplateDecl>(ToD)) {
  165. EXPECT_TRUE(ToT->getTemplatedDecl());
  166. }
  167. }
  168. void TypedTest_ImportPrototypeAfterImportedPrototype() {
  169. Decl *FromTU = getTuDecl(getPrototype() + getPrototype(), Lang_CXX);
  170. auto *From0 = FirstDeclMatcher<DeclTy>().match(FromTU, getPattern());
  171. auto *From1 = LastDeclMatcher<DeclTy>().match(FromTU, getPattern());
  172. ASSERT_FALSE(From0->isThisDeclarationADefinition());
  173. ASSERT_FALSE(From1->isThisDeclarationADefinition());
  174. Decl *Imported0 = Import(From0, Lang_CXX);
  175. Decl *Imported1 = Import(From1, Lang_CXX);
  176. Decl *ToTU = Imported0->getTranslationUnitDecl();
  177. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 2u);
  178. auto *To0 = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  179. auto *To1 = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  180. EXPECT_TRUE(Imported0 == To0);
  181. EXPECT_TRUE(Imported1 == To1);
  182. EXPECT_FALSE(To0->isThisDeclarationADefinition());
  183. EXPECT_FALSE(To1->isThisDeclarationADefinition());
  184. CheckPreviousDecl(To0, To1);
  185. }
  186. void TypedTest_ImportDefinitionAfterImportedPrototype() {
  187. Decl *FromTU = getTuDecl(getPrototype() + getDefinition(), Lang_CXX);
  188. auto *FromProto = FirstDeclMatcher<DeclTy>().match(FromTU, getPattern());
  189. auto *FromDef = LastDeclMatcher<DeclTy>().match(FromTU, getPattern());
  190. ASSERT_FALSE(FromProto->isThisDeclarationADefinition());
  191. ASSERT_TRUE(FromDef->isThisDeclarationADefinition());
  192. Decl *ImportedProto = Import(FromProto, Lang_CXX);
  193. Decl *ImportedDef = Import(FromDef, Lang_CXX);
  194. Decl *ToTU = ImportedProto->getTranslationUnitDecl();
  195. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 2u);
  196. auto *ToProto = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  197. auto *ToDef = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  198. EXPECT_TRUE(ImportedProto == ToProto);
  199. EXPECT_TRUE(ImportedDef == ToDef);
  200. EXPECT_FALSE(ToProto->isThisDeclarationADefinition());
  201. EXPECT_TRUE(ToDef->isThisDeclarationADefinition());
  202. CheckPreviousDecl(ToProto, ToDef);
  203. }
  204. void TypedTest_ImportPrototypeAfterImportedDefinition() {
  205. Decl *FromTU = getTuDecl(getDefinition() + getPrototype(), Lang_CXX);
  206. auto *FromDef = FirstDeclMatcher<DeclTy>().match(FromTU, getPattern());
  207. auto *FromProto = LastDeclMatcher<DeclTy>().match(FromTU, getPattern());
  208. ASSERT_TRUE(FromDef->isThisDeclarationADefinition());
  209. ASSERT_FALSE(FromProto->isThisDeclarationADefinition());
  210. Decl *ImportedDef = Import(FromDef, Lang_CXX);
  211. Decl *ImportedProto = Import(FromProto, Lang_CXX);
  212. Decl *ToTU = ImportedDef->getTranslationUnitDecl();
  213. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 2u);
  214. auto *ToDef = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  215. auto *ToProto = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  216. EXPECT_TRUE(ImportedDef == ToDef);
  217. EXPECT_TRUE(ImportedProto == ToProto);
  218. EXPECT_TRUE(ToDef->isThisDeclarationADefinition());
  219. EXPECT_FALSE(ToProto->isThisDeclarationADefinition());
  220. CheckPreviousDecl(ToDef, ToProto);
  221. }
  222. void TypedTest_ImportPrototypes() {
  223. Decl *FromTU0 = getTuDecl(getPrototype(), Lang_CXX, "input0.cc");
  224. Decl *FromTU1 = getTuDecl(getPrototype(), Lang_CXX, "input1.cc");
  225. auto *From0 = FirstDeclMatcher<DeclTy>().match(FromTU0, getPattern());
  226. auto *From1 = FirstDeclMatcher<DeclTy>().match(FromTU1, getPattern());
  227. ASSERT_FALSE(From0->isThisDeclarationADefinition());
  228. ASSERT_FALSE(From1->isThisDeclarationADefinition());
  229. Decl *Imported0 = Import(From0, Lang_CXX);
  230. Decl *Imported1 = Import(From1, Lang_CXX);
  231. Decl *ToTU = Imported0->getTranslationUnitDecl();
  232. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 2u);
  233. auto *To0 = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  234. auto *To1 = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  235. EXPECT_TRUE(Imported0 == To0);
  236. EXPECT_TRUE(Imported1 == To1);
  237. EXPECT_FALSE(To0->isThisDeclarationADefinition());
  238. EXPECT_FALSE(To1->isThisDeclarationADefinition());
  239. CheckPreviousDecl(To0, To1);
  240. }
  241. void TypedTest_ImportDefinitions() {
  242. Decl *FromTU0 = getTuDecl(getDefinition(), Lang_CXX, "input0.cc");
  243. Decl *FromTU1 = getTuDecl(getDefinition(), Lang_CXX, "input1.cc");
  244. auto *From0 = FirstDeclMatcher<DeclTy>().match(FromTU0, getPattern());
  245. auto *From1 = FirstDeclMatcher<DeclTy>().match(FromTU1, getPattern());
  246. ASSERT_TRUE(From0->isThisDeclarationADefinition());
  247. ASSERT_TRUE(From1->isThisDeclarationADefinition());
  248. Decl *Imported0 = Import(From0, Lang_CXX);
  249. Decl *Imported1 = Import(From1, Lang_CXX);
  250. Decl *ToTU = Imported0->getTranslationUnitDecl();
  251. EXPECT_EQ(Imported0, Imported1);
  252. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 1u);
  253. auto *To0 = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  254. EXPECT_TRUE(Imported0 == To0);
  255. EXPECT_TRUE(To0->isThisDeclarationADefinition());
  256. if (auto *ToT0 = dyn_cast<TemplateDecl>(To0)) {
  257. EXPECT_TRUE(ToT0->getTemplatedDecl());
  258. }
  259. }
  260. void TypedTest_ImportDefinitionThenPrototype() {
  261. Decl *FromTUDef = getTuDecl(getDefinition(), Lang_CXX, "input0.cc");
  262. Decl *FromTUProto = getTuDecl(getPrototype(), Lang_CXX, "input1.cc");
  263. auto *FromDef = FirstDeclMatcher<DeclTy>().match(FromTUDef, getPattern());
  264. auto *FromProto =
  265. FirstDeclMatcher<DeclTy>().match(FromTUProto, getPattern());
  266. ASSERT_TRUE(FromDef->isThisDeclarationADefinition());
  267. ASSERT_FALSE(FromProto->isThisDeclarationADefinition());
  268. Decl *ImportedDef = Import(FromDef, Lang_CXX);
  269. Decl *ImportedProto = Import(FromProto, Lang_CXX);
  270. Decl *ToTU = ImportedDef->getTranslationUnitDecl();
  271. EXPECT_NE(ImportedDef, ImportedProto);
  272. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 2u);
  273. auto *ToDef = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  274. auto *ToProto = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  275. EXPECT_TRUE(ImportedDef == ToDef);
  276. EXPECT_TRUE(ImportedProto == ToProto);
  277. EXPECT_TRUE(ToDef->isThisDeclarationADefinition());
  278. EXPECT_FALSE(ToProto->isThisDeclarationADefinition());
  279. CheckPreviousDecl(ToDef, ToProto);
  280. }
  281. void TypedTest_ImportPrototypeThenDefinition() {
  282. Decl *FromTUProto = getTuDecl(getPrototype(), Lang_CXX, "input0.cc");
  283. Decl *FromTUDef = getTuDecl(getDefinition(), Lang_CXX, "input1.cc");
  284. auto *FromProto =
  285. FirstDeclMatcher<DeclTy>().match(FromTUProto, getPattern());
  286. auto *FromDef = FirstDeclMatcher<DeclTy>().match(FromTUDef, getPattern());
  287. ASSERT_TRUE(FromDef->isThisDeclarationADefinition());
  288. ASSERT_FALSE(FromProto->isThisDeclarationADefinition());
  289. Decl *ImportedProto = Import(FromProto, Lang_CXX);
  290. Decl *ImportedDef = Import(FromDef, Lang_CXX);
  291. Decl *ToTU = ImportedDef->getTranslationUnitDecl();
  292. EXPECT_NE(ImportedDef, ImportedProto);
  293. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 2u);
  294. auto *ToProto = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  295. auto *ToDef = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  296. EXPECT_TRUE(ImportedDef == ToDef);
  297. EXPECT_TRUE(ImportedProto == ToProto);
  298. EXPECT_TRUE(ToDef->isThisDeclarationADefinition());
  299. EXPECT_FALSE(ToProto->isThisDeclarationADefinition());
  300. CheckPreviousDecl(ToProto, ToDef);
  301. }
  302. void TypedTest_WholeRedeclChainIsImportedAtOnce() {
  303. Decl *FromTU = getTuDecl(getPrototype() + getDefinition(), Lang_CXX);
  304. auto *FromD = // Definition
  305. LastDeclMatcher<DeclTy>().match(FromTU, getPattern());
  306. ASSERT_TRUE(FromD->isThisDeclarationADefinition());
  307. Decl *ImportedD = Import(FromD, Lang_CXX);
  308. Decl *ToTU = ImportedD->getTranslationUnitDecl();
  309. // The whole redecl chain is imported at once.
  310. EXPECT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 2u);
  311. EXPECT_TRUE(cast<DeclTy>(ImportedD)->isThisDeclarationADefinition());
  312. }
  313. void TypedTest_ImportPrototypeThenProtoAndDefinition() {
  314. {
  315. Decl *FromTU = getTuDecl(getPrototype(), Lang_CXX, "input0.cc");
  316. auto *FromD = FirstDeclMatcher<DeclTy>().match(FromTU, getPattern());
  317. Import(FromD, Lang_CXX);
  318. }
  319. {
  320. Decl *FromTU =
  321. getTuDecl(getPrototype() + getDefinition(), Lang_CXX, "input1.cc");
  322. auto *FromD = FirstDeclMatcher<DeclTy>().match(FromTU, getPattern());
  323. Import(FromD, Lang_CXX);
  324. }
  325. Decl *ToTU = ToAST->getASTContext().getTranslationUnitDecl();
  326. ASSERT_EQ(DeclCounter<DeclTy>().match(ToTU, getPattern()), 3u);
  327. DeclTy *ProtoD = FirstDeclMatcher<DeclTy>().match(ToTU, getPattern());
  328. EXPECT_FALSE(ProtoD->isThisDeclarationADefinition());
  329. DeclTy *DefinitionD = LastDeclMatcher<DeclTy>().match(ToTU, getPattern());
  330. EXPECT_TRUE(DefinitionD->isThisDeclarationADefinition());
  331. EXPECT_TRUE(DefinitionD->getPreviousDecl());
  332. EXPECT_FALSE(
  333. DefinitionD->getPreviousDecl()->isThisDeclarationADefinition());
  334. CheckPreviousDecl(ProtoD, DefinitionD->getPreviousDecl());
  335. }
  336. };
  337. #define ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(BaseTemplate, TypeParam, \
  338. NamePrefix, TestCase) \
  339. using BaseTemplate##TypeParam = BaseTemplate<TypeParam>; \
  340. TEST_P(BaseTemplate##TypeParam, NamePrefix##TestCase) { \
  341. TypedTest_##TestCase(); \
  342. }
  343. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(
  344. RedeclChain, Function, ,
  345. PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)
  346. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(
  347. RedeclChain, Class, ,
  348. PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)
  349. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(
  350. RedeclChain, Variable, ,
  351. PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)
  352. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(
  353. RedeclChain, FunctionTemplate, ,
  354. PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)
  355. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(
  356. RedeclChain, ClassTemplate, ,
  357. PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)
  358. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(
  359. RedeclChain, FunctionTemplateSpec, ,
  360. PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)
  361. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(
  362. RedeclChain, ClassTemplateSpec, ,
  363. PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)
  364. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  365. DefinitionShouldBeImportedAsADefinition)
  366. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,
  367. DefinitionShouldBeImportedAsADefinition)
  368. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  369. DefinitionShouldBeImportedAsADefinition)
  370. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  371. DefinitionShouldBeImportedAsADefinition)
  372. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  373. DefinitionShouldBeImportedAsADefinition)
  374. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  375. DefinitionShouldBeImportedAsADefinition)
  376. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  377. DefinitionShouldBeImportedAsADefinition)
  378. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  379. ImportPrototypeAfterImportedPrototype)
  380. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,
  381. ImportPrototypeAfterImportedPrototype)
  382. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  383. ImportPrototypeAfterImportedPrototype)
  384. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  385. ImportPrototypeAfterImportedPrototype)
  386. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  387. ImportPrototypeAfterImportedPrototype)
  388. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  389. ImportPrototypeAfterImportedPrototype)
  390. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  391. ImportPrototypeAfterImportedPrototype)
  392. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  393. ImportDefinitionAfterImportedPrototype)
  394. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,
  395. ImportDefinitionAfterImportedPrototype)
  396. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  397. ImportDefinitionAfterImportedPrototype)
  398. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  399. ImportDefinitionAfterImportedPrototype)
  400. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  401. ImportDefinitionAfterImportedPrototype)
  402. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  403. ImportDefinitionAfterImportedPrototype)
  404. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  405. ImportDefinitionAfterImportedPrototype)
  406. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  407. ImportPrototypeAfterImportedDefinition)
  408. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,
  409. ImportPrototypeAfterImportedDefinition)
  410. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  411. ImportPrototypeAfterImportedDefinition)
  412. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  413. ImportPrototypeAfterImportedDefinition)
  414. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  415. ImportPrototypeAfterImportedDefinition)
  416. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  417. ImportPrototypeAfterImportedDefinition)
  418. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  419. ImportPrototypeAfterImportedDefinition)
  420. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  421. ImportPrototypes)
  422. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, , ImportPrototypes)
  423. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  424. ImportPrototypes)
  425. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  426. ImportPrototypes)
  427. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  428. ImportPrototypes)
  429. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  430. ImportPrototypes)
  431. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  432. ImportPrototypes)
  433. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  434. ImportDefinitions)
  435. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, , ImportDefinitions)
  436. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  437. ImportDefinitions)
  438. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  439. ImportDefinitions)
  440. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  441. ImportDefinitions)
  442. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  443. ImportDefinitions)
  444. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  445. ImportDefinitions)
  446. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  447. ImportDefinitionThenPrototype)
  448. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,
  449. ImportDefinitionThenPrototype)
  450. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  451. ImportDefinitionThenPrototype)
  452. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  453. ImportDefinitionThenPrototype)
  454. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  455. ImportDefinitionThenPrototype)
  456. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  457. ImportDefinitionThenPrototype)
  458. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  459. ImportDefinitionThenPrototype)
  460. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  461. ImportPrototypeThenDefinition)
  462. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,
  463. ImportPrototypeThenDefinition)
  464. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  465. ImportPrototypeThenDefinition)
  466. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  467. ImportPrototypeThenDefinition)
  468. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,
  469. ImportPrototypeThenDefinition)
  470. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  471. ImportPrototypeThenDefinition)
  472. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,
  473. ImportPrototypeThenDefinition)
  474. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  475. WholeRedeclChainIsImportedAtOnce)
  476. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  477. WholeRedeclChainIsImportedAtOnce)
  478. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  479. WholeRedeclChainIsImportedAtOnce)
  480. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  481. WholeRedeclChainIsImportedAtOnce)
  482. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,
  483. ImportPrototypeThenProtoAndDefinition)
  484. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,
  485. ImportPrototypeThenProtoAndDefinition)
  486. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,
  487. ImportPrototypeThenProtoAndDefinition)
  488. ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,
  489. ImportPrototypeThenProtoAndDefinition)
  490. INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunction,
  491. DefaultTestValuesForRunOptions, );
  492. INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClass,
  493. DefaultTestValuesForRunOptions, );
  494. INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainVariable,
  495. DefaultTestValuesForRunOptions, );
  496. INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunctionTemplate,
  497. DefaultTestValuesForRunOptions, );
  498. INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClassTemplate,
  499. DefaultTestValuesForRunOptions, );
  500. INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunctionTemplateSpec,
  501. DefaultTestValuesForRunOptions, );
  502. INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClassTemplateSpec,
  503. DefaultTestValuesForRunOptions, );
  504. } // end namespace ast_matchers
  505. } // end namespace clang