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