@@ -1345,7 +1345,30 @@ namespace {
1345
1345
bool IsValueParam (const clang::TemplateArgument &argument) {
1346
1346
return argument.getKind () == TemplateArgument::Integral;
1347
1347
}
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
+ }
1348
1370
}
1371
+ } // namespace
1349
1372
1350
1373
static TemplateParameterList *CreateTemplateParameterList (
1351
1374
ASTContext &ast,
@@ -2552,6 +2575,22 @@ ClangASTMetadata *TypeSystemClang::GetMetadata(const clang::Type *object) {
2552
2575
return nullptr ;
2553
2576
}
2554
2577
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
+
2555
2594
clang::DeclContext *
2556
2595
TypeSystemClang::GetDeclContextForType (const CompilerType &type) {
2557
2596
return GetDeclContextForType (ClangUtil::GetQualType (type));
@@ -7276,9 +7315,17 @@ clang::FieldDecl *TypeSystemClang::AddFieldToRecordType(
7276
7315
}
7277
7316
7278
7317
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
+ }
7282
7329
record_decl->addDecl (field);
7283
7330
7284
7331
VerifyDecl (field);
@@ -7657,6 +7704,11 @@ clang::CXXMethodDecl *TypeSystemClang::AddMethodToCXXRecordType(
7657
7704
7658
7705
cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl *>(params));
7659
7706
7707
+ AddAccessSpecifierDecl (cxx_record_decl, getASTContext (),
7708
+ GetCXXRecordDeclAccess (cxx_record_decl),
7709
+ access_specifier);
7710
+ SetCXXRecordDeclAccess (cxx_record_decl, access_specifier);
7711
+
7660
7712
cxx_record_decl->addDecl (cxx_method_decl);
7661
7713
7662
7714
// Sometimes the debug info will mention a constructor (default/copy/move),
@@ -8190,6 +8242,11 @@ bool TypeSystemClang::CompleteTagDeclarationDefinition(
8190
8242
if (qual_type.isNull ())
8191
8243
return false ;
8192
8244
8245
+ TypeSystemClang *lldb_ast =
8246
+ llvm::dyn_cast<TypeSystemClang>(type.GetTypeSystem ());
8247
+ if (lldb_ast == nullptr )
8248
+ return false ;
8249
+
8193
8250
// Make sure we use the same methodology as
8194
8251
// TypeSystemClang::StartTagDeclarationDefinition() as to how we start/end
8195
8252
// the definition.
@@ -8220,6 +8277,8 @@ bool TypeSystemClang::CompleteTagDeclarationDefinition(
8220
8277
cxx_record_decl->setHasLoadedFieldsFromExternalStorage (true );
8221
8278
cxx_record_decl->setHasExternalLexicalStorage (false );
8222
8279
cxx_record_decl->setHasExternalVisibleStorage (false );
8280
+ lldb_ast->SetCXXRecordDeclAccess (cxx_record_decl,
8281
+ clang::AccessSpecifier::AS_none);
8223
8282
return true ;
8224
8283
}
8225
8284
}
@@ -8233,10 +8292,6 @@ bool TypeSystemClang::CompleteTagDeclarationDefinition(
8233
8292
if (enum_decl->isCompleteDefinition ())
8234
8293
return true ;
8235
8294
8236
- TypeSystemClang *lldb_ast =
8237
- llvm::dyn_cast<TypeSystemClang>(type.GetTypeSystem ());
8238
- if (lldb_ast == nullptr )
8239
- return false ;
8240
8295
clang::ASTContext &ast = lldb_ast->getASTContext ();
8241
8296
8242
8297
// / TODO This really needs to be fixed.
0 commit comments