diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 37 | ||||
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 8 | ||||
| -rw-r--r-- | clang/lib/AST/DeclBase.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/AST/ExprClassification.cpp | 1 | 
4 files changed, 48 insertions, 3 deletions
| diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 7b16809a1f1..980e93c04d3 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -98,6 +98,7 @@ namespace {      Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);      Decl *VisitCXXConversionDecl(CXXConversionDecl *D);      Decl *VisitFieldDecl(FieldDecl *D); +    Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D);      Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);      Decl *VisitVarDecl(VarDecl *D);      Decl *VisitImplicitParamDecl(ImplicitParamDecl *D); @@ -2020,6 +2021,42 @@ Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {    return ToField;  } +Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { +  // Import the major distinguishing characteristics of a variable. +  DeclContext *DC, *LexicalDC; +  DeclarationName Name; +  SourceLocation Loc; +  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc)) +    return 0; + +  // Import the type. +  QualType T = Importer.Import(D->getType()); +  if (T.isNull()) +    return 0; + +  NamedDecl **NamedChain = +    new (Importer.getToContext())NamedDecl*[D->getChainingSize()]; + +  unsigned i = 0; +  for (IndirectFieldDecl::chain_iterator PI = D->chain_begin(), +       PE = D->chain_end(); PI != PE; ++PI) { +    Decl* D = Importer.Import(*PI); +    if (!D) +      return 0; +    NamedChain[i++] = cast<NamedDecl>(D); +  } + +  IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create( +                                         Importer.getToContext(), DC, +                                         Loc, Name.getAsIdentifierInfo(), T, +                                         NamedChain, D->getChainingSize()); +  ToIndirectField->setAccess(D->getAccess()); +  ToIndirectField->setLexicalDeclContext(LexicalDC); +  Importer.Imported(D, ToIndirectField); +  LexicalDC->addDecl(ToIndirectField); +  return ToIndirectField; +} +  Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {    // Import the major distinguishing characteristics of an ivar.    DeclContext *DC, *LexicalDC; diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index c448116ed2e..ef8f16861e2 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -768,7 +768,7 @@ bool NamedDecl::isCXXInstanceMember() const {    if (isa<UsingShadowDecl>(D))      D = cast<UsingShadowDecl>(D)->getTargetDecl(); -  if (isa<FieldDecl>(D)) +  if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D))      return true;    if (isa<CXXMethodDecl>(D))      return cast<CXXMethodDecl>(D)->isInstance(); @@ -2030,6 +2030,12 @@ EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,    return new (C) EnumConstantDecl(CD, L, Id, T, E, V);  } +IndirectFieldDecl *IndirectFieldDecl::Create(ASTContext &C, DeclContext *DC, +                                          SourceLocation L, IdentifierInfo *Id, +                                          QualType T, NamedDecl **CH, int CHS) { +  return new (C) IndirectFieldDecl(DC, L, Id, T, CH, CHS); +} +  SourceRange EnumConstantDecl::getSourceRange() const {    SourceLocation End = getLocation();    if (Init) diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index 5ba6623b20b..7d8a92530e0 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -249,6 +249,9 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {      case ObjCProperty:        return IDNS_Ordinary; +    case IndirectField: +      return IDNS_Ordinary | IDNS_Member; +      case ObjCCompatibleAlias:      case ObjCInterface:        return IDNS_Ordinary | IDNS_Type; @@ -524,8 +527,6 @@ bool DeclContext::isTransparentContext() const {      return !cast<EnumDecl>(this)->isScoped();    else if (DeclKind == Decl::LinkageSpec)      return true; -  else if (DeclKind >= Decl::firstRecord && DeclKind <= Decl::lastRecord) -    return cast<RecordDecl>(this)->isAnonymousStructOrUnion();    return false;  } diff --git a/clang/lib/AST/ExprClassification.cpp b/clang/lib/AST/ExprClassification.cpp index ba5970038d7..bf26bd1f93f 100644 --- a/clang/lib/AST/ExprClassification.cpp +++ b/clang/lib/AST/ExprClassification.cpp @@ -333,6 +333,7 @@ static Cl::Kinds ClassifyDecl(ASTContext &Ctx, const Decl *D) {      islvalue = NTTParm->getType()->isReferenceType();    else      islvalue = isa<VarDecl>(D) || isa<FieldDecl>(D) || +	  isa<IndirectFieldDecl>(D) ||        (Ctx.getLangOptions().CPlusPlus &&          (isa<FunctionDecl>(D) || isa<FunctionTemplateDecl>(D))); | 

