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,7 +527,11 @@ 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+       auto * Scope = GetScopeFromType (TND->getUnderlyingType ());
531+       if  (Scope)
532+         D = Scope;
533+     } else  if  (auto * USS = dyn_cast_or_null<UsingShadowDecl>(D)) {
534+       auto * Scope = USS->getTargetDecl ();
530535      if  (Scope)
531536        D = Scope;
532537    }
@@ -1151,10 +1156,12 @@ namespace Cpp {
11511156    auto  *D = (Decl *) scope;
11521157
11531158    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 ());
1159+       getSema ().ForceDeclarationOfImplicitMembers (CXXRD);
1160+ 
1161+       llvm::SmallVector<RecordDecl::decl_iterator, 2 > stack_begin;
1162+       llvm::SmallVector<RecordDecl::decl_iterator, 2 > stack_end;
1163+       stack_begin.push_back (CXXRD->decls_begin ());
1164+       stack_end.push_back (CXXRD->decls_end ());
11581165      while  (!stack_begin.empty ()) {
11591166        if  (stack_begin.back () == stack_end.back ()) {
11601167          stack_begin.pop_back ();
@@ -1167,14 +1174,18 @@ namespace Cpp {
11671174            if  (const  auto * RT = FD->getType ()->getAs <RecordType>()) {
11681175              if  (auto * CXXRD = llvm::dyn_cast<CXXRecordDecl>(RT->getDecl ())) {
11691176                stack_begin.back ()++;
1170-                 stack_begin.push_back (CXXRD->field_begin ());
1171-                 stack_end.push_back (CXXRD->field_end ());
1177+                 stack_begin.push_back (CXXRD->decls_begin ());
1178+                 stack_end.push_back (CXXRD->decls_end ());
11721179                continue ;
11731180              }
11741181            }
11751182          }
1183+           datamembers.push_back ((TCppScope_t)D);
1184+ 
1185+         } else  if  (auto * USD = llvm::dyn_cast<UsingShadowDecl>(D)) {
1186+           if  (llvm::isa<FieldDecl>(USD->getTargetDecl ()))
1187+             datamembers.push_back (USD);
11761188        }
1177-         datamembers.push_back ((TCppScope_t)D);
11781189        stack_begin.back ()++;
11791190      }
11801191    }
@@ -1321,11 +1332,7 @@ namespace Cpp {
13211332  bool  CheckVariableAccess (TCppScope_t var, AccessSpecifier AS)
13221333  {
13231334    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 ;
1335+     return  D->getAccess () == AS;
13291336  }
13301337
13311338  bool  IsPublicVariable (TCppScope_t var)
0 commit comments