@@ -1345,7 +1345,30 @@ namespace {
13451345bool IsValueParam (const clang::TemplateArgument &argument) {
13461346 return argument.getKind () == TemplateArgument::Integral;
13471347}
1348+
1349+ void AddAccessSpecifierDecl (clang::CXXRecordDecl *cxx_record_decl,
1350+ ASTContext &ct,
1351+ clang::AccessSpecifier previous_access,
1352+ clang::AccessSpecifier access_specifier) {
1353+ if (!cxx_record_decl->isClass () && !cxx_record_decl->isStruct ())
1354+ return ;
1355+ if (previous_access != access_specifier) {
1356+ // For struct, don't add AS_public if it's the first AccessSpecDecl.
1357+ // For class, don't add AS_private if it's the first AccessSpecDecl.
1358+ if ((cxx_record_decl->isStruct () &&
1359+ previous_access == clang::AccessSpecifier::AS_none &&
1360+ access_specifier == clang::AccessSpecifier::AS_public) ||
1361+ (cxx_record_decl->isClass () &&
1362+ previous_access == clang::AccessSpecifier::AS_none &&
1363+ access_specifier == clang::AccessSpecifier::AS_private)) {
1364+ return ;
1365+ }
1366+ cxx_record_decl->addDecl (
1367+ AccessSpecDecl::Create (ct, access_specifier, cxx_record_decl,
1368+ SourceLocation (), SourceLocation ()));
1369+ }
13481370}
1371+ } // namespace
13491372
13501373static TemplateParameterList *CreateTemplateParameterList (
13511374 ASTContext &ast,
@@ -2552,6 +2575,22 @@ ClangASTMetadata *TypeSystemClang::GetMetadata(const clang::Type *object) {
25522575 return nullptr ;
25532576}
25542577
2578+ void TypeSystemClang::SetCXXRecordDeclAccess (const clang::CXXRecordDecl *object,
2579+ clang::AccessSpecifier access) {
2580+ if (access == clang::AccessSpecifier::AS_none)
2581+ m_cxx_record_decl_access.erase (object);
2582+ else
2583+ m_cxx_record_decl_access[object] = access;
2584+ }
2585+
2586+ clang::AccessSpecifier
2587+ TypeSystemClang::GetCXXRecordDeclAccess (const clang::CXXRecordDecl *object) {
2588+ auto It = m_cxx_record_decl_access.find (object);
2589+ if (It != m_cxx_record_decl_access.end ())
2590+ return It->second ;
2591+ return clang::AccessSpecifier::AS_none;
2592+ }
2593+
25552594clang::DeclContext *
25562595TypeSystemClang::GetDeclContextForType (const CompilerType &type) {
25572596 return GetDeclContextForType (ClangUtil::GetQualType (type));
@@ -7276,9 +7315,17 @@ clang::FieldDecl *TypeSystemClang::AddFieldToRecordType(
72767315 }
72777316
72787317 if (field) {
7279- field->setAccess (
7280- TypeSystemClang::ConvertAccessTypeToAccessSpecifier (access));
7281-
7318+ clang::AccessSpecifier access_specifier =
7319+ TypeSystemClang::ConvertAccessTypeToAccessSpecifier (access);
7320+ field->setAccess (access_specifier);
7321+
7322+ if (clang::CXXRecordDecl *cxx_record_decl =
7323+ llvm::dyn_cast<CXXRecordDecl>(record_decl)) {
7324+ AddAccessSpecifierDecl (cxx_record_decl, ast->getASTContext (),
7325+ ast->GetCXXRecordDeclAccess (cxx_record_decl),
7326+ access_specifier);
7327+ ast->SetCXXRecordDeclAccess (cxx_record_decl, access_specifier);
7328+ }
72827329 record_decl->addDecl (field);
72837330
72847331 VerifyDecl (field);
@@ -7657,6 +7704,11 @@ clang::CXXMethodDecl *TypeSystemClang::AddMethodToCXXRecordType(
76577704
76587705 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl *>(params));
76597706
7707+ AddAccessSpecifierDecl (cxx_record_decl, getASTContext (),
7708+ GetCXXRecordDeclAccess (cxx_record_decl),
7709+ access_specifier);
7710+ SetCXXRecordDeclAccess (cxx_record_decl, access_specifier);
7711+
76607712 cxx_record_decl->addDecl (cxx_method_decl);
76617713
76627714 // Sometimes the debug info will mention a constructor (default/copy/move),
@@ -8190,6 +8242,11 @@ bool TypeSystemClang::CompleteTagDeclarationDefinition(
81908242 if (qual_type.isNull ())
81918243 return false ;
81928244
8245+ TypeSystemClang *lldb_ast =
8246+ llvm::dyn_cast<TypeSystemClang>(type.GetTypeSystem ());
8247+ if (lldb_ast == nullptr )
8248+ return false ;
8249+
81938250 // Make sure we use the same methodology as
81948251 // TypeSystemClang::StartTagDeclarationDefinition() as to how we start/end
81958252 // the definition.
@@ -8220,6 +8277,8 @@ bool TypeSystemClang::CompleteTagDeclarationDefinition(
82208277 cxx_record_decl->setHasLoadedFieldsFromExternalStorage (true );
82218278 cxx_record_decl->setHasExternalLexicalStorage (false );
82228279 cxx_record_decl->setHasExternalVisibleStorage (false );
8280+ lldb_ast->SetCXXRecordDeclAccess (cxx_record_decl,
8281+ clang::AccessSpecifier::AS_none);
82238282 return true ;
82248283 }
82258284 }
@@ -8233,10 +8292,6 @@ bool TypeSystemClang::CompleteTagDeclarationDefinition(
82338292 if (enum_decl->isCompleteDefinition ())
82348293 return true ;
82358294
8236- TypeSystemClang *lldb_ast =
8237- llvm::dyn_cast<TypeSystemClang>(type.GetTypeSystem ());
8238- if (lldb_ast == nullptr )
8239- return false ;
82408295 clang::ASTContext &ast = lldb_ast->getASTContext ();
82418296
82428297 // / TODO This really needs to be fixed.
0 commit comments