29
29
#endif
30
30
#include " clang/Sema/TemplateDeduction.h"
31
31
32
+ #include " llvm/ADT/SmallVector.h"
32
33
#include " llvm/ADT/StringRef.h"
33
34
#include " llvm/Support/Casting.h"
34
35
#include " llvm/Support/Debug.h"
@@ -526,8 +527,10 @@ namespace Cpp {
526
527
527
528
static clang::Decl* GetUnderlyingScope (clang::Decl * D) {
528
529
if (auto *TND = dyn_cast_or_null<TypedefNameDecl>(D)) {
529
- auto Scope = GetScopeFromType (TND->getUnderlyingType ());
530
- if (Scope)
530
+ if (auto * Scope = GetScopeFromType (TND->getUnderlyingType ()))
531
+ D = Scope;
532
+ } else if (auto * USS = dyn_cast_or_null<UsingShadowDecl>(D)) {
533
+ if (auto * Scope = USS->getTargetDecl ())
531
534
D = Scope;
532
535
}
533
536
@@ -1151,10 +1154,12 @@ namespace Cpp {
1151
1154
auto *D = (Decl *) scope;
1152
1155
1153
1156
if (auto * CXXRD = llvm::dyn_cast_or_null<CXXRecordDecl>(D)) {
1154
- llvm::SmallVector<RecordDecl::field_iterator, 2 > stack_begin;
1155
- llvm::SmallVector<RecordDecl::field_iterator, 2 > stack_end;
1156
- stack_begin.push_back (CXXRD->field_begin ());
1157
- stack_end.push_back (CXXRD->field_end ());
1157
+ getSema ().ForceDeclarationOfImplicitMembers (CXXRD);
1158
+
1159
+ llvm::SmallVector<RecordDecl::decl_iterator, 2 > stack_begin;
1160
+ llvm::SmallVector<RecordDecl::decl_iterator, 2 > stack_end;
1161
+ stack_begin.push_back (CXXRD->decls_begin ());
1162
+ stack_end.push_back (CXXRD->decls_end ());
1158
1163
while (!stack_begin.empty ()) {
1159
1164
if (stack_begin.back () == stack_end.back ()) {
1160
1165
stack_begin.pop_back ();
@@ -1167,14 +1172,18 @@ namespace Cpp {
1167
1172
if (const auto * RT = FD->getType ()->getAs <RecordType>()) {
1168
1173
if (auto * CXXRD = llvm::dyn_cast<CXXRecordDecl>(RT->getDecl ())) {
1169
1174
stack_begin.back ()++;
1170
- stack_begin.push_back (CXXRD->field_begin ());
1171
- stack_end.push_back (CXXRD->field_end ());
1175
+ stack_begin.push_back (CXXRD->decls_begin ());
1176
+ stack_end.push_back (CXXRD->decls_end ());
1172
1177
continue ;
1173
1178
}
1174
1179
}
1175
1180
}
1181
+ datamembers.push_back ((TCppScope_t)D);
1182
+
1183
+ } else if (auto * USD = llvm::dyn_cast<UsingShadowDecl>(D)) {
1184
+ if (llvm::isa<FieldDecl>(USD->getTargetDecl ()))
1185
+ datamembers.push_back (USD);
1176
1186
}
1177
- datamembers.push_back ((TCppScope_t)D);
1178
1187
stack_begin.back ()++;
1179
1188
}
1180
1189
}
@@ -1321,11 +1330,7 @@ namespace Cpp {
1321
1330
bool CheckVariableAccess (TCppScope_t var, AccessSpecifier AS)
1322
1331
{
1323
1332
auto *D = (Decl *) var;
1324
- if (auto *CXXMD = llvm::dyn_cast_or_null<DeclaratorDecl>(D)) {
1325
- return CXXMD->getAccess () == AS;
1326
- }
1327
-
1328
- return false ;
1333
+ return D->getAccess () == AS;
1329
1334
}
1330
1335
1331
1336
bool IsPublicVariable (TCppScope_t var)
0 commit comments