Author: balazske Date: Mon May 27 02:36:00 2019 New Revision: 361752 URL: http://llvm.org/viewvc/llvm-project?rev=361752&view=rev Log: [ASTImporter] Added visibility context check for CXXRecordDecl.
Summary: ASTImporter makes now difference between classes with same name in different translation units if these are not visible outside. These classes are not linked into one decl chain. Reviewers: martong, a.sidorin, shafik Reviewed By: shafik Subscribers: rnkovacs, dkrupp, Szelethus, gamesh411, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D62312 Modified: cfe/trunk/lib/AST/ASTImporter.cpp cfe/trunk/unittests/AST/ASTImporterVisibilityTest.cpp Modified: cfe/trunk/lib/AST/ASTImporter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=361752&r1=361751&r2=361752&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTImporter.cpp (original) +++ cfe/trunk/lib/AST/ASTImporter.cpp Mon May 27 02:36:00 2019 @@ -2559,6 +2559,9 @@ ExpectedDecl ASTNodeImporter::VisitRecor if (!IsStructuralMatch(D, FoundRecord, false)) continue; + if (!hasSameVisibilityContext(FoundRecord, D)) + continue; + if (IsStructuralMatch(D, FoundRecord)) { RecordDecl *FoundDef = FoundRecord->getDefinition(); if (D->isThisDeclarationADefinition() && FoundDef) { Modified: cfe/trunk/unittests/AST/ASTImporterVisibilityTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTImporterVisibilityTest.cpp?rev=361752&r1=361751&r2=361752&view=diff ============================================================================== --- cfe/trunk/unittests/AST/ASTImporterVisibilityTest.cpp (original) +++ cfe/trunk/unittests/AST/ASTImporterVisibilityTest.cpp Mon May 27 02:36:00 2019 @@ -31,6 +31,10 @@ struct GetVarPattern { using DeclTy = VarDecl; BindableMatcher<Decl> operator()() { return varDecl(hasName("v")); } }; +struct GetClassPattern { + using DeclTy = CXXRecordDecl; + BindableMatcher<Decl> operator()() { return cxxRecordDecl(hasName("X")); } +}; // Values for the value-parameterized test fixtures. // FunctionDecl: @@ -41,6 +45,9 @@ const auto *AnonF = "namespace { void f( const auto *ExternV = "extern int v;"; const auto *StaticV = "static int v;"; const auto *AnonV = "namespace { extern int v; }"; +// CXXRecordDecl: +const auto *ExternC = "class X;"; +const auto *AnonC = "namespace { class X; }"; // First value in tuple: Compile options. // Second value in tuple: Source code to be used in the test. @@ -84,14 +91,19 @@ protected: // Manual instantiation of the fixture with each type. using ImportFunctionsVisibilityChain = ImportVisibilityChain<GetFunPattern>; using ImportVariablesVisibilityChain = ImportVisibilityChain<GetVarPattern>; -// Value-parameterized test for the first type. +using ImportClassesVisibilityChain = ImportVisibilityChain<GetClassPattern>; +// Value-parameterized test for functions. TEST_P(ImportFunctionsVisibilityChain, ImportChain) { TypedTest_ImportChain(); } -// Value-parameterized test for the second type. +// Value-parameterized test for variables. TEST_P(ImportVariablesVisibilityChain, ImportChain) { TypedTest_ImportChain(); } +// Value-parameterized test for classes. +TEST_P(ImportClassesVisibilityChain, ImportChain) { + TypedTest_ImportChain(); +} // Automatic instantiation of the value-parameterized tests. INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctionsVisibilityChain, @@ -110,6 +122,11 @@ INSTANTIATE_TEST_CASE_P( // provided but they must have the same linkage. See also the test // ImportVariableChainInC which test for this special C Lang case. ::testing::Values(ExternV, AnonV)), ); +INSTANTIATE_TEST_CASE_P( + ParameterizedTests, ImportClassesVisibilityChain, + ::testing::Combine( + DefaultTestValuesForRunOptions, + ::testing::Values(ExternC, AnonC)), ); // First value in tuple: Compile options. // Second value in tuple: Tuple with informations for the test. @@ -169,6 +186,7 @@ protected: }; using ImportFunctionsVisibility = ImportVisibility<GetFunPattern>; using ImportVariablesVisibility = ImportVisibility<GetVarPattern>; +using ImportClassesVisibility = ImportVisibility<GetClassPattern>; // FunctionDecl. TEST_P(ImportFunctionsVisibility, ImportAfter) { @@ -184,6 +202,13 @@ TEST_P(ImportVariablesVisibility, Import TEST_P(ImportVariablesVisibility, ImportAfterImport) { TypedTest_ImportAfterImport(); } +// CXXRecordDecl. +TEST_P(ImportClassesVisibility, ImportAfter) { + TypedTest_ImportAfter(); +} +TEST_P(ImportClassesVisibility, ImportAfterImport) { + TypedTest_ImportAfterImport(); +} const bool ExpectLink = true; const bool ExpectNotLink = false; @@ -214,6 +239,14 @@ INSTANTIATE_TEST_CASE_P( std::make_tuple(AnonV, ExternV, ExpectNotLink), std::make_tuple(AnonV, StaticV, ExpectNotLink), std::make_tuple(AnonV, AnonV, ExpectNotLink))), ); +INSTANTIATE_TEST_CASE_P( + ParameterizedTests, ImportClassesVisibility, + ::testing::Combine( + DefaultTestValuesForRunOptions, + ::testing::Values(std::make_tuple(ExternC, ExternC, ExpectLink), + std::make_tuple(ExternC, AnonC, ExpectNotLink), + std::make_tuple(AnonC, ExternC, ExpectNotLink), + std::make_tuple(AnonC, AnonC, ExpectNotLink))), ); } // end namespace ast_matchers } // end namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits