2929#endif
3030#include " clang/Sema/TemplateDeduction.h"
3131
32+ #include " llvm/ADT/SmallVector.h"
3233#include " llvm/ADT/StringRef.h"
3334#include " llvm/Support/Casting.h"
3435#include " llvm/Support/Debug.h"
@@ -526,8 +527,10 @@ namespace Cpp {
526527
527528 static clang::Decl* GetUnderlyingScope (clang::Decl * D) {
528529 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 ())
531534 D = Scope;
532535 }
533536
@@ -1151,10 +1154,12 @@ namespace Cpp {
11511154 auto *D = (Decl *) scope;
11521155
11531156 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 ());
11581163 while (!stack_begin.empty ()) {
11591164 if (stack_begin.back () == stack_end.back ()) {
11601165 stack_begin.pop_back ();
@@ -1167,14 +1172,18 @@ namespace Cpp {
11671172 if (const auto * RT = FD->getType ()->getAs <RecordType>()) {
11681173 if (auto * CXXRD = llvm::dyn_cast<CXXRecordDecl>(RT->getDecl ())) {
11691174 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 ());
11721177 continue ;
11731178 }
11741179 }
11751180 }
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);
11761186 }
1177- datamembers.push_back ((TCppScope_t)D);
11781187 stack_begin.back ()++;
11791188 }
11801189 }
@@ -1321,11 +1330,7 @@ namespace Cpp {
13211330 bool CheckVariableAccess (TCppScope_t var, AccessSpecifier AS)
13221331 {
13231332 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;
13291334 }
13301335
13311336 bool IsPublicVariable (TCppScope_t var)
0 commit comments