diff options
Diffstat (limited to 'lib/AST')
| -rw-r--r-- | lib/AST/ASTContext.cpp | 106 | ||||
| -rw-r--r-- | lib/AST/ASTImporter.cpp | 48 | ||||
| -rw-r--r-- | lib/AST/Decl.cpp | 73 | ||||
| -rw-r--r-- | lib/AST/DeclBase.cpp | 16 | ||||
| -rw-r--r-- | lib/AST/DeclCXX.cpp | 32 | ||||
| -rw-r--r-- | lib/AST/DeclPrinter.cpp | 6 | ||||
| -rw-r--r-- | lib/AST/Expr.cpp | 13 | ||||
| -rw-r--r-- | lib/AST/ExprCXX.cpp | 42 | ||||
| -rw-r--r-- | lib/AST/ExprConstant.cpp | 2 | ||||
| -rw-r--r-- | lib/AST/ItaniumMangle.cpp | 10 | ||||
| -rw-r--r-- | lib/AST/NestedNameSpecifier.cpp | 182 | ||||
| -rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 93 | ||||
| -rw-r--r-- | lib/AST/Stmt.cpp | 4 | ||||
| -rw-r--r-- | lib/AST/StmtDumper.cpp | 4 | ||||
| -rw-r--r-- | lib/AST/TemplateBase.cpp | 18 | 
15 files changed, 397 insertions, 252 deletions
| diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 945dfb87f297..9c2455034d68 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -205,7 +205,7 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM,    DeclarationNames(*this),    ExternalSource(0), Listener(0), PrintingPolicy(LOpts),    LastSDM(0, 0), -  UniqueBlockByRefTypeID(0), UniqueBlockParmTypeID(0) { +  UniqueBlockByRefTypeID(0) {    ObjCIdRedefinitionType = QualType();    ObjCClassRedefinitionType = QualType();    ObjCSelRedefinitionType = QualType();     @@ -874,7 +874,7 @@ ASTContext::getTypeInfo(const Type *T) const {    case Type::Auto: {      const AutoType *A = cast<AutoType>(T);      assert(A->isDeduced() && "Cannot request the size of a dependent type"); -    return getTypeInfo(cast<AutoType>(T)->getDeducedType().getTypePtr()); +    return getTypeInfo(A->getDeducedType().getTypePtr());    }    case Type::Paren: @@ -2683,12 +2683,22 @@ QualType ASTContext::getDecltypeType(Expr *e) const {    return QualType(dt, 0);  } -/// getAutoType - Unlike many "get<Type>" functions, we don't unique -/// AutoType AST's. +/// getAutoType - We only unique auto types after they've been deduced.  QualType ASTContext::getAutoType(QualType DeducedType) const { -  AutoType *at = new (*this, TypeAlignment) AutoType(DeducedType); -  Types.push_back(at); -  return QualType(at, 0); +  void *InsertPos = 0; +  if (!DeducedType.isNull()) { +    // Look in the folding set for an existing type. +    llvm::FoldingSetNodeID ID; +    AutoType::Profile(ID, DeducedType); +    if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos)) +      return QualType(AT, 0); +  } + +  AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType); +  Types.push_back(AT); +  if (InsertPos) +    AutoTypes.InsertNode(AT, InsertPos); +  return QualType(AT, 0);  }  /// getTagDeclType - Return the unique reference to the type for the @@ -2971,7 +2981,15 @@ ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const {    case NestedNameSpecifier::Namespace:      // A namespace is canonical; build a nested-name-specifier with      // this namespace and no prefix. -    return NestedNameSpecifier::Create(*this, 0, NNS->getAsNamespace()); +    return NestedNameSpecifier::Create(*this, 0,  +                                 NNS->getAsNamespace()->getOriginalNamespace()); + +  case NestedNameSpecifier::NamespaceAlias: +    // A namespace is canonical; build a nested-name-specifier with +    // this namespace and no prefix. +    return NestedNameSpecifier::Create(*this, 0,  +                                    NNS->getAsNamespaceAlias()->getNamespace() +                                                      ->getOriginalNamespace());    case NestedNameSpecifier::TypeSpec:    case NestedNameSpecifier::TypeSpecWithTemplate: { @@ -3609,78 +3627,6 @@ ASTContext::BuildByRefType(llvm::StringRef DeclName, QualType Ty) const {    return getPointerType(getTagDeclType(T));  } - -QualType ASTContext::getBlockParmType( -  bool BlockHasCopyDispose, -  llvm::SmallVectorImpl<const Expr *> &Layout) const { - -  // FIXME: Move up -  llvm::SmallString<36> Name; -  llvm::raw_svector_ostream(Name) << "__block_literal_" -                                  << ++UniqueBlockParmTypeID; -  RecordDecl *T; -  T = CreateRecordDecl(*this, TTK_Struct, TUDecl, SourceLocation(), -                       &Idents.get(Name.str())); -  T->startDefinition(); -  QualType FieldTypes[] = { -    getPointerType(VoidPtrTy), -    IntTy, -    IntTy, -    getPointerType(VoidPtrTy), -    (BlockHasCopyDispose ? -     getPointerType(getBlockDescriptorExtendedType()) : -     getPointerType(getBlockDescriptorType())) -  }; - -  const char *FieldNames[] = { -    "__isa", -    "__flags", -    "__reserved", -    "__FuncPtr", -    "__descriptor" -  }; - -  for (size_t i = 0; i < 5; ++i) { -    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), -                                         &Idents.get(FieldNames[i]), -                                         FieldTypes[i], /*TInfo=*/0, -                                         /*BitWidth=*/0, /*Mutable=*/false); -    Field->setAccess(AS_public); -    T->addDecl(Field); -  } - -  for (unsigned i = 0; i < Layout.size(); ++i) { -    const Expr *E = Layout[i]; - -    QualType FieldType = E->getType(); -    IdentifierInfo *FieldName = 0; -    if (isa<CXXThisExpr>(E)) { -      FieldName = &Idents.get("this"); -    } else if (const BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(E)) { -      const ValueDecl *D = BDRE->getDecl(); -      FieldName = D->getIdentifier(); -      if (BDRE->isByRef()) -        FieldType = BuildByRefType(D->getName(), FieldType); -    } else { -      // Padding. -      assert(isa<ConstantArrayType>(FieldType) && -             isa<DeclRefExpr>(E) && -             !cast<DeclRefExpr>(E)->getDecl()->getDeclName() && -             "doesn't match characteristics of padding decl"); -    } - -    FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), -                                         FieldName, FieldType, /*TInfo=*/0, -                                         /*BitWidth=*/0, /*Mutable=*/false); -    Field->setAccess(AS_public); -    T->addDecl(Field); -  } - -  T->completeDefinition(); - -  return getPointerType(getTagDeclType(T)); -} -  void ASTContext::setObjCFastEnumerationStateType(QualType T) {    const RecordType *Rec = T->getAs<RecordType>();    assert(Rec && "Invalid ObjCFAstEnumerationStateType"); diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index 65c0a3bb619f..21f10fb7ad99 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -2097,11 +2097,7 @@ Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {                                    D->isScoped(), D->isScopedUsingClassTag(),                                    D->isFixed());    // Import the qualifier, if any. -  if (D->getQualifier()) { -    NestedNameSpecifier *NNS = Importer.Import(D->getQualifier()); -    SourceRange NNSRange = Importer.Import(D->getQualifierRange()); -    D2->setQualifierInfo(NNS, NNSRange); -  } +  D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));    D2->setAccess(D->getAccess());    D2->setLexicalDeclContext(LexicalDC);    Importer.Imported(D, D2); @@ -2225,12 +2221,8 @@ Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {                                      Name.getAsIdentifierInfo(),                                       Importer.Import(D->getTagKeywordLoc()));      } -    // Import the qualifier, if any. -    if (D->getQualifier()) { -      NestedNameSpecifier *NNS = Importer.Import(D->getQualifier()); -      SourceRange NNSRange = Importer.Import(D->getQualifierRange()); -      D2->setQualifierInfo(NNS, NNSRange); -    } +     +    D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));      D2->setLexicalDeclContext(LexicalDC);      LexicalDC->addDecl(D2);    } @@ -2408,11 +2400,7 @@ Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {    }    // Import the qualifier, if any. -  if (D->getQualifier()) { -    NestedNameSpecifier *NNS = Importer.Import(D->getQualifier()); -    SourceRange NNSRange = Importer.Import(D->getQualifierRange()); -    ToFunction->setQualifierInfo(NNS, NNSRange); -  } +  ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc()));    ToFunction->setAccess(D->getAccess());    ToFunction->setLexicalDeclContext(LexicalDC);    ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); @@ -2666,12 +2654,7 @@ Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {                                     Name.getAsIdentifierInfo(), T, TInfo,                                     D->getStorageClass(),                                     D->getStorageClassAsWritten()); -  // Import the qualifier, if any. -  if (D->getQualifier()) { -    NestedNameSpecifier *NNS = Importer.Import(D->getQualifier()); -    SourceRange NNSRange = Importer.Import(D->getQualifierRange()); -    ToVar->setQualifierInfo(NNS, NNSRange); -  } +  ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));    ToVar->setAccess(D->getAccess());    ToVar->setLexicalDeclContext(LexicalDC);    Importer.Imported(D, ToVar); @@ -3591,14 +3574,7 @@ Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {                                                       Name.getAsIdentifierInfo(),                                                                                        Importer.Import(DTemplated->getTagKeywordLoc()));    D2Templated->setAccess(DTemplated->getAccess()); -   -   -  // Import the qualifier, if any. -  if (DTemplated->getQualifier()) { -    NestedNameSpecifier *NNS = Importer.Import(DTemplated->getQualifier()); -    SourceRange NNSRange = Importer.Import(DTemplated->getQualifierRange()); -    D2Templated->setQualifierInfo(NNS, NNSRange); -  } +  D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));    D2Templated->setLexicalDeclContext(LexicalDC);    // Create the class template declaration itself. @@ -3703,12 +3679,7 @@ Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(      ClassTemplate->AddSpecialization(D2, InsertPos);      // Import the qualifier, if any. -    if (D->getQualifier()) { -      NestedNameSpecifier *NNS = Importer.Import(D->getQualifier()); -      SourceRange NNSRange = Importer.Import(D->getQualifierRange()); -      D2->setQualifierInfo(NNS, NNSRange); -    } - +    D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));      // Add the specialization to this context.      D2->setLexicalDeclContext(LexicalDC); @@ -4067,6 +4038,11 @@ NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {    return 0;  } +NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { +  // FIXME: Implement! +  return NestedNameSpecifierLoc(); +} +  TemplateName ASTImporter::Import(TemplateName From) {    switch (From.getKind()) {    case TemplateName::Template: diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 56db8c7e330b..73fe117b1e4e 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -266,8 +266,12 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {        return LinkageInfo::internal();    } -  if (D->isInAnonymousNamespace()) -    return LinkageInfo::uniqueExternal(); +  if (D->isInAnonymousNamespace()) { +    const VarDecl *Var = dyn_cast<VarDecl>(D); +    const FunctionDecl *Func = dyn_cast<FunctionDecl>(D); +    if ((!Var || !Var->isExternC()) && (!Func || !Func->isExternC())) +      return LinkageInfo::uniqueExternal(); +  }    // Set up the defaults. @@ -704,7 +708,7 @@ static LinkageInfo getLVForDecl(const NamedDecl *D, LVFlags Flags) {    //   external linkage.    if (D->getLexicalDeclContext()->isFunctionOrMethod()) {      if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { -      if (Function->isInAnonymousNamespace()) +      if (Function->isInAnonymousNamespace() && !Function->isExternC())          return LinkageInfo::uniqueExternal();        LinkageInfo LV; @@ -725,7 +729,7 @@ static LinkageInfo getLVForDecl(const NamedDecl *D, LVFlags Flags) {      if (const VarDecl *Var = dyn_cast<VarDecl>(D))        if (Var->getStorageClass() == SC_Extern ||            Var->getStorageClass() == SC_PrivateExtern) { -        if (Var->isInAnonymousNamespace()) +        if (Var->isInAnonymousNamespace() && !Var->isExternC())            return LinkageInfo::uniqueExternal();          LinkageInfo LV; @@ -837,8 +841,10 @@ bool NamedDecl::declarationReplaces(NamedDecl *OldD) const {    // UsingDirectiveDecl's are not really NamedDecl's, and all have same name.    // We want to keep it, unless it nominates same namespace.    if (getKind() == Decl::UsingDirective) { -    return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() == -           cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace(); +    return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() +             ->getOriginalNamespace() == +           cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace() +             ->getOriginalNamespace();    }    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) @@ -864,9 +870,13 @@ bool NamedDecl::declarationReplaces(NamedDecl *OldD) const {      return cast<UsingShadowDecl>(this)->getTargetDecl() ==             cast<UsingShadowDecl>(OldD)->getTargetDecl(); -  if (isa<UsingDecl>(this) && isa<UsingDecl>(OldD)) -    return cast<UsingDecl>(this)->getTargetNestedNameDecl() == -           cast<UsingDecl>(OldD)->getTargetNestedNameDecl(); +  if (isa<UsingDecl>(this) && isa<UsingDecl>(OldD)) { +    ASTContext &Context = getASTContext(); +    return Context.getCanonicalNestedNameSpecifier( +                                     cast<UsingDecl>(this)->getQualifier()) == +           Context.getCanonicalNestedNameSpecifier( +                                        cast<UsingDecl>(OldD)->getQualifier()); +  }    // For non-function declarations, if the declarations are of the    // same kind then this must be a redeclaration, or semantic analysis @@ -927,9 +937,8 @@ SourceLocation DeclaratorDecl::getTypeSpecStartLoc() const {    return SourceLocation();  } -void DeclaratorDecl::setQualifierInfo(NestedNameSpecifier *Qualifier, -                                      SourceRange QualifierRange) { -  if (Qualifier) { +void DeclaratorDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) { +  if (QualifierLoc) {      // Make sure the extended decl info is allocated.      if (!hasExtInfo()) {        // Save (non-extended) type source info pointer. @@ -940,12 +949,10 @@ void DeclaratorDecl::setQualifierInfo(NestedNameSpecifier *Qualifier,        getExtInfo()->TInfo = savedTInfo;      }      // Set qualifier info. -    getExtInfo()->NNS = Qualifier; -    getExtInfo()->NNSRange = QualifierRange; +    getExtInfo()->QualifierLoc = QualifierLoc;    }    else {      // Here Qualifier == 0, i.e., we are removing the qualifier (if any). -    assert(QualifierRange.isInvalid());      if (hasExtInfo()) {        // Save type source info pointer.        TypeSourceInfo *savedTInfo = getExtInfo()->TInfo; @@ -967,7 +974,7 @@ QualifierInfo::setTemplateParameterListsInfo(ASTContext &Context,                                               TemplateParameterList **TPLists) {    assert((NumTPLists == 0 || TPLists != 0) &&           "Empty array of template parameters with positive size!"); -  assert((NumTPLists == 0 || NNS) && +  assert((NumTPLists == 0 || QualifierLoc) &&           "Nonempty array of template parameters with no qualifier!");    // Free previous template parameters (if any). @@ -1037,8 +1044,11 @@ bool VarDecl::isExternC() const {              getStorageClass() != SC_Static) ||        (getDeclContext()->isFunctionOrMethod() && hasExternalStorage()); -  for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); -       DC = DC->getParent()) { +  const DeclContext *DC = getDeclContext(); +  if (DC->isFunctionOrMethod()) +    return false; + +  for (; !DC->isTranslationUnit(); DC = DC->getParent()) {      if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))  {        if (Linkage->getLanguage() == LinkageSpecDecl::lang_c)          return getStorageClass() != SC_Static; @@ -1046,8 +1056,6 @@ bool VarDecl::isExternC() const {        break;      } -    if (DC->isFunctionOrMethod()) -      return false;    }    return false; @@ -1363,8 +1371,11 @@ bool FunctionDecl::isExternC() const {    if (!Context.getLangOptions().CPlusPlus)      return getStorageClass() != SC_Static && !getAttr<OverloadableAttr>(); -  for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); -       DC = DC->getParent()) { +  const DeclContext *DC = getDeclContext(); +  if (DC->isRecord()) +    return false; + +  for (; !DC->isTranslationUnit(); DC = DC->getParent()) {      if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))  {        if (Linkage->getLanguage() == LinkageSpecDecl::lang_c)          return getStorageClass() != SC_Static && @@ -1372,9 +1383,6 @@ bool FunctionDecl::isExternC() const {        break;      } -     -    if (DC->isRecord()) -      break;    }    return isMain(); @@ -2018,19 +2026,16 @@ TagDecl* TagDecl::getDefinition() const {    return 0;  } -void TagDecl::setQualifierInfo(NestedNameSpecifier *Qualifier, -                               SourceRange QualifierRange) { -  if (Qualifier) { +void TagDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) { +  if (QualifierLoc) {      // Make sure the extended qualifier info is allocated.      if (!hasExtInfo())        TypedefDeclOrQualifier = new (getASTContext()) ExtInfo;      // Set qualifier info. -    getExtInfo()->NNS = Qualifier; -    getExtInfo()->NNSRange = QualifierRange; +    getExtInfo()->QualifierLoc = QualifierLoc;    }    else {      // Here Qualifier == 0, i.e., we are removing the qualifier (if any). -    assert(QualifierRange.isInvalid());      if (hasExtInfo()) {        getASTContext().Deallocate(getExtInfo());        TypedefDeclOrQualifier = (TypedefDecl*) 0; @@ -2211,8 +2216,10 @@ NamespaceDecl *NamespaceDecl::getNextNamespace() {  }  ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, -    SourceLocation L, IdentifierInfo *Id, QualType T) { -  return new (C) ImplicitParamDecl(ImplicitParam, DC, L, Id, T); +                                             SourceLocation loc, +                                             IdentifierInfo *name, +                                             QualType type) { +  return new (C) ImplicitParamDecl(DC, loc, name, type);  }  FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index be379d522dd4..81df00d6c7e8 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -465,6 +465,22 @@ void Decl::CheckAccessDeclContext() const {  #endif  } +DeclContext *Decl::getNonClosureContext() { +  DeclContext *DC = getDeclContext(); + +  // This is basically "while (DC->isClosure()) DC = DC->getParent();" +  // except that it's significantly more efficient to cast to a known +  // decl type and call getDeclContext() than to call getParent(). +  do { +    if (isa<BlockDecl>(DC)) { +      DC = cast<BlockDecl>(DC)->getDeclContext(); +      continue; +    } +  } while (false); + +  assert(!DC->isClosure()); +  return DC; +}  //===----------------------------------------------------------------------===//  // DeclContext Implementation diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index fba73f59d563..46768c12d879 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -1267,15 +1267,14 @@ LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,  UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,                                                 SourceLocation L,                                                 SourceLocation NamespaceLoc, -                                               SourceRange QualifierRange, -                                               NestedNameSpecifier *Qualifier, +                                           NestedNameSpecifierLoc QualifierLoc,                                                 SourceLocation IdentLoc,                                                 NamedDecl *Used,                                                 DeclContext *CommonAncestor) {    if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used))      Used = NS->getOriginalNamespace(); -  return new (C) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierRange, -                                    Qualifier, IdentLoc, Used, CommonAncestor); +  return new (C) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc, +                                    IdentLoc, Used, CommonAncestor);  }  NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() { @@ -1289,14 +1288,13 @@ NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,                                                 SourceLocation UsingLoc,                                                 SourceLocation AliasLoc,                                                 IdentifierInfo *Alias, -                                               SourceRange QualifierRange, -                                               NestedNameSpecifier *Qualifier, +                                           NestedNameSpecifierLoc QualifierLoc,                                                 SourceLocation IdentLoc,                                                 NamedDecl *Namespace) {    if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))      Namespace = NS->getOriginalNamespace(); -  return new (C) NamespaceAliasDecl(DC, UsingLoc, AliasLoc, Alias, QualifierRange, -                                    Qualifier, IdentLoc, Namespace); +  return new (C) NamespaceAliasDecl(DC, UsingLoc, AliasLoc, Alias,  +                                    QualifierLoc, IdentLoc, Namespace);  }  UsingDecl *UsingShadowDecl::getUsingDecl() const { @@ -1337,35 +1335,31 @@ void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {    S->UsingOrNextShadow = this;  } -UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, -                             SourceRange NNR, SourceLocation UL, -                             NestedNameSpecifier* TargetNNS, +UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL, +                             NestedNameSpecifierLoc QualifierLoc,                               const DeclarationNameInfo &NameInfo,                               bool IsTypeNameArg) { -  return new (C) UsingDecl(DC, NNR, UL, TargetNNS, NameInfo, IsTypeNameArg); +  return new (C) UsingDecl(DC, UL, QualifierLoc, NameInfo, IsTypeNameArg);  }  UnresolvedUsingValueDecl *  UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,                                   SourceLocation UsingLoc, -                                 SourceRange TargetNNR, -                                 NestedNameSpecifier *TargetNNS, +                                 NestedNameSpecifierLoc QualifierLoc,                                   const DeclarationNameInfo &NameInfo) {    return new (C) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc, -                                          TargetNNR, TargetNNS, NameInfo); +                                          QualifierLoc, NameInfo);  }  UnresolvedUsingTypenameDecl *  UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,                                      SourceLocation UsingLoc,                                      SourceLocation TypenameLoc, -                                    SourceRange TargetNNR, -                                    NestedNameSpecifier *TargetNNS, +                                    NestedNameSpecifierLoc QualifierLoc,                                      SourceLocation TargetNameLoc,                                      DeclarationName TargetName) {    return new (C) UnresolvedUsingTypenameDecl(DC, UsingLoc, TypenameLoc, -                                             TargetNNR, TargetNNS, -                                             TargetNameLoc, +                                             QualifierLoc, TargetNameLoc,                                               TargetName.getAsIdentifierInfo());  } diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp index 77b42574709f..c6ae128e42b5 100644 --- a/lib/AST/DeclPrinter.cpp +++ b/lib/AST/DeclPrinter.cpp @@ -918,20 +918,20 @@ void DeclPrinter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PID) {  void DeclPrinter::VisitUsingDecl(UsingDecl *D) {    Out << "using "; -  D->getTargetNestedNameDecl()->print(Out, Policy); +  D->getQualifier()->print(Out, Policy);    Out << D;  }  void  DeclPrinter::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {    Out << "using typename "; -  D->getTargetNestedNameSpecifier()->print(Out, Policy); +  D->getQualifier()->print(Out, Policy);    Out << D->getDeclName();  }  void DeclPrinter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {    Out << "using "; -  D->getTargetNestedNameSpecifier()->print(Out, Policy); +  D->getQualifier()->print(Out, Policy);    Out << D->getDeclName();  } diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 391b26ab48ea..1c1061b5a229 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -836,6 +836,19 @@ QualType CallExpr::getCallReturnType() const {    return FnType->getResultType();  } +SourceRange CallExpr::getSourceRange() const { +  if (isa<CXXOperatorCallExpr>(this)) +    return cast<CXXOperatorCallExpr>(this)->getSourceRange(); + +  SourceLocation begin = getCallee()->getLocStart(); +  if (begin.isInvalid() && getNumArgs() > 0) +    begin = getArg(0)->getLocStart(); +  SourceLocation end = getRParenLoc(); +  if (end.isInvalid() && getNumArgs() > 0) +    end = getArg(getNumArgs() - 1)->getLocEnd(); +  return SourceRange(begin, end); +} +  OffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,                                      SourceLocation OperatorLoc,                                     TypeSourceInfo *tsi,  diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 28ff9fb57afc..4f4a6b4944d9 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -128,10 +128,10 @@ PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)  }  CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context, -    Expr *Base, bool isArrow, SourceLocation OperatorLoc, -    NestedNameSpecifier *Qualifier, SourceRange QualifierRange, -    TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc, -    SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType) +                Expr *Base, bool isArrow, SourceLocation OperatorLoc, +                NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType,  +                SourceLocation ColonColonLoc, SourceLocation TildeLoc,  +                PseudoDestructorTypeStorage DestroyedType)    : Expr(CXXPseudoDestructorExprClass,           Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,                                           FunctionProtoType::ExtProtoInfo())), @@ -142,15 +142,16 @@ CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,           /*isValueDependent=*/Base->isValueDependent(),           // ContainsUnexpandedParameterPack           (Base->containsUnexpandedParameterPack() || -          (Qualifier && Qualifier->containsUnexpandedParameterPack()) || +          (QualifierLoc &&  +           QualifierLoc.getNestedNameSpecifier() +                                        ->containsUnexpandedParameterPack()) ||            (ScopeType &&              ScopeType->getType()->containsUnexpandedParameterPack()) ||            (DestroyedType.getTypeSourceInfo() &&             DestroyedType.getTypeSourceInfo()->getType()                                     ->containsUnexpandedParameterPack()))),      Base(static_cast<Stmt *>(Base)), IsArrow(isArrow), -    OperatorLoc(OperatorLoc), Qualifier(Qualifier), -    QualifierRange(QualifierRange),  +    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),      ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),      DestroyedType(DestroyedType) { } @@ -282,15 +283,16 @@ CXXRecordDecl *OverloadExpr::getNamingClass() const {  // DependentScopeDeclRefExpr  DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T, -                            NestedNameSpecifier *Qualifier, -                            SourceRange QualifierRange, +                            NestedNameSpecifierLoc QualifierLoc,                              const DeclarationNameInfo &NameInfo,                              const TemplateArgumentListInfo *Args)    : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,           true, true,           (NameInfo.containsUnexpandedParameterPack() || -          (Qualifier && Qualifier->containsUnexpandedParameterPack()))), -    NameInfo(NameInfo), QualifierRange(QualifierRange), Qualifier(Qualifier), +          (QualifierLoc &&  +           QualifierLoc.getNestedNameSpecifier() +                            ->containsUnexpandedParameterPack()))), +    QualifierLoc(QualifierLoc), NameInfo(NameInfo),       HasExplicitTemplateArgs(Args != 0)  {    if (Args) { @@ -306,16 +308,14 @@ DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,  DependentScopeDeclRefExpr *  DependentScopeDeclRefExpr::Create(ASTContext &C, -                                  NestedNameSpecifier *Qualifier, -                                  SourceRange QualifierRange, +                                  NestedNameSpecifierLoc QualifierLoc,                                    const DeclarationNameInfo &NameInfo,                                    const TemplateArgumentListInfo *Args) {    std::size_t size = sizeof(DependentScopeDeclRefExpr);    if (Args)      size += ExplicitTemplateArgumentList::sizeFor(*Args);    void *Mem = C.Allocate(size); -  return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, -                                             Qualifier, QualifierRange, +  return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc,                                                NameInfo, Args);  } @@ -328,13 +328,16 @@ DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,      size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);    void *Mem = C.Allocate(size);    DependentScopeDeclRefExpr *E  -    = new (Mem) DependentScopeDeclRefExpr(QualType(), 0, SourceRange(), +    = new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(),                                            DeclarationNameInfo(), 0);    E->HasExplicitTemplateArgs = HasExplicitTemplateArgs;    return E;  }  SourceRange CXXConstructExpr::getSourceRange() const { +  if (isa<CXXTemporaryObjectExpr>(this)) +    return cast<CXXTemporaryObjectExpr>(this)->getSourceRange(); +    if (ParenRange.isValid())      return SourceRange(Loc, ParenRange.getEnd()); @@ -397,13 +400,6 @@ CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {    return ThisArg->getType()->getAsCXXRecordDecl();  } -SourceRange CXXMemberCallExpr::getSourceRange() const { -  SourceLocation LocStart = getCallee()->getLocStart(); -  if (LocStart.isInvalid() && getNumArgs() > 0) -    LocStart = getArg(0)->getLocStart(); -  return SourceRange(LocStart, getRParenLoc()); -} -  //===----------------------------------------------------------------------===//  //  Named casts diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 656bb99df98e..3a5eb66ea18f 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -2926,7 +2926,7 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {            Exp->getOpcode() == BO_Rem) {          // Evaluate gives an error for undefined Div/Rem, so make sure          // we don't evaluate one. -        if (LHSResult.Val != 2 && RHSResult.Val != 2) { +        if (LHSResult.Val == 0 && RHSResult.Val == 0) {            llvm::APSInt REval = Exp->getRHS()->EvaluateAsInt(Ctx);            if (REval == 0)              return ICEDiag(1, E->getLocStart()); diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index d66c374cbec0..939ca7a924aa 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -606,6 +606,9 @@ void CXXNameMangler::mangleUnresolvedScope(NestedNameSpecifier *Qualifier) {    case NestedNameSpecifier::Namespace:      mangleName(Qualifier->getAsNamespace());      break; +  case NestedNameSpecifier::NamespaceAlias: +    mangleName(Qualifier->getAsNamespaceAlias()->getNamespace()); +    break;    case NestedNameSpecifier::TypeSpec:    case NestedNameSpecifier::TypeSpecWithTemplate: {      const Type *QTy = Qualifier->getAsType(); @@ -1647,8 +1650,11 @@ void CXXNameMangler::mangleType(const DecltypeType *T) {  void CXXNameMangler::mangleType(const AutoType *T) {    QualType D = T->getDeducedType(); -  assert(!D.isNull() && "can't mangle undeduced auto type"); -  mangleType(D); +  // <builtin-type> ::= Da  # dependent auto +  if (D.isNull()) +    Out << "Da"; +  else +    mangleType(D);  }  void CXXNameMangler::mangleIntegerLiteral(QualType T, diff --git a/lib/AST/NestedNameSpecifier.cpp b/lib/AST/NestedNameSpecifier.cpp index 650321d76ee5..6f1ec058d74e 100644 --- a/lib/AST/NestedNameSpecifier.cpp +++ b/lib/AST/NestedNameSpecifier.cpp @@ -14,8 +14,10 @@  #include "clang/AST/NestedNameSpecifier.h"  #include "clang/AST/ASTContext.h"  #include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h"  #include "clang/AST/PrettyPrinter.h"  #include "clang/AST/Type.h" +#include "clang/AST/TypeLoc.h"  #include "llvm/Support/raw_ostream.h"  #include <cassert> @@ -46,7 +48,7 @@ NestedNameSpecifier::Create(const ASTContext &Context,    NestedNameSpecifier Mockup;    Mockup.Prefix.setPointer(Prefix); -  Mockup.Prefix.setInt(Identifier); +  Mockup.Prefix.setInt(StoredIdentifier);    Mockup.Specifier = II;    return FindOrInsert(Context, Mockup);  } @@ -60,19 +62,34 @@ NestedNameSpecifier::Create(const ASTContext &Context,           "Broken nested name specifier");    NestedNameSpecifier Mockup;    Mockup.Prefix.setPointer(Prefix); -  Mockup.Prefix.setInt(Namespace); +  Mockup.Prefix.setInt(StoredNamespaceOrAlias);    Mockup.Specifier = NS;    return FindOrInsert(Context, Mockup);  }  NestedNameSpecifier *  NestedNameSpecifier::Create(const ASTContext &Context, +                            NestedNameSpecifier *Prefix,  +                            NamespaceAliasDecl *Alias) { +  assert(Alias && "Namespace alias cannot be NULL"); +  assert((!Prefix || +          (Prefix->getAsType() == 0 && Prefix->getAsIdentifier() == 0)) && +         "Broken nested name specifier"); +  NestedNameSpecifier Mockup; +  Mockup.Prefix.setPointer(Prefix); +  Mockup.Prefix.setInt(StoredNamespaceOrAlias); +  Mockup.Specifier = Alias; +  return FindOrInsert(Context, Mockup); +} + +NestedNameSpecifier * +NestedNameSpecifier::Create(const ASTContext &Context,                              NestedNameSpecifier *Prefix,                              bool Template, const Type *T) {    assert(T && "Type cannot be NULL");    NestedNameSpecifier Mockup;    Mockup.Prefix.setPointer(Prefix); -  Mockup.Prefix.setInt(Template? TypeSpecWithTemplate : TypeSpec); +  Mockup.Prefix.setInt(Template? StoredTypeSpecWithTemplate : StoredTypeSpec);    Mockup.Specifier = const_cast<Type*>(T);    return FindOrInsert(Context, Mockup);  } @@ -82,7 +99,7 @@ NestedNameSpecifier::Create(const ASTContext &Context, IdentifierInfo *II) {    assert(II && "Identifier cannot be NULL");    NestedNameSpecifier Mockup;    Mockup.Prefix.setPointer(0); -  Mockup.Prefix.setInt(Identifier); +  Mockup.Prefix.setInt(StoredIdentifier);    Mockup.Specifier = II;    return FindOrInsert(Context, Mockup);  } @@ -94,6 +111,47 @@ NestedNameSpecifier::GlobalSpecifier(const ASTContext &Context) {    return Context.GlobalNestedNameSpecifier;  } +NestedNameSpecifier::SpecifierKind NestedNameSpecifier::getKind() const { +  if (Specifier == 0) +    return Global; + +  switch (Prefix.getInt()) { +  case StoredIdentifier: +    return Identifier; + +  case StoredNamespaceOrAlias: +    return isa<NamespaceDecl>(static_cast<NamedDecl *>(Specifier))? Namespace +                                                            : NamespaceAlias; + +  case StoredTypeSpec: +    return TypeSpec; + +  case StoredTypeSpecWithTemplate: +    return TypeSpecWithTemplate; +  } + +  return Global; +} + +/// \brief Retrieve the namespace stored in this nested name +/// specifier. +NamespaceDecl *NestedNameSpecifier::getAsNamespace() const { +  if (Prefix.getInt() == StoredNamespaceOrAlias) +    return dyn_cast<NamespaceDecl>(static_cast<NamedDecl *>(Specifier)); + +  return 0; +} + +/// \brief Retrieve the namespace alias stored in this nested name +/// specifier. +NamespaceAliasDecl *NestedNameSpecifier::getAsNamespaceAlias() const { +  if (Prefix.getInt() == StoredNamespaceOrAlias) +    return dyn_cast<NamespaceAliasDecl>(static_cast<NamedDecl *>(Specifier)); + +  return 0; +} + +  /// \brief Whether this nested name specifier refers to a dependent  /// type or not.  bool NestedNameSpecifier::isDependent() const { @@ -103,6 +161,7 @@ bool NestedNameSpecifier::isDependent() const {      return true;    case Namespace: +  case NamespaceAlias:    case Global:      return false; @@ -121,6 +180,7 @@ bool NestedNameSpecifier::containsUnexpandedParameterPack() const {      return getPrefix() && getPrefix()->containsUnexpandedParameterPack();    case Namespace: +  case NamespaceAlias:    case Global:      return false; @@ -147,7 +207,11 @@ NestedNameSpecifier::print(llvm::raw_ostream &OS,      break;    case Namespace: -    OS << getAsNamespace()->getIdentifier()->getName(); +    OS << getAsNamespace()->getName(); +    break; + +  case NamespaceAlias: +    OS << getAsNamespaceAlias()->getName();      break;    case Global: @@ -199,3 +263,111 @@ NestedNameSpecifier::print(llvm::raw_ostream &OS,  void NestedNameSpecifier::dump(const LangOptions &LO) {    print(llvm::errs(), PrintingPolicy(LO));  } + +unsigned  +NestedNameSpecifierLoc::getLocalDataLength(NestedNameSpecifier *Qualifier) { +  assert(Qualifier && "Expected a non-NULL qualifier"); + +  // Location of the trailing '::'. +  unsigned Length = sizeof(unsigned); + +  switch (Qualifier->getKind()) { +  case NestedNameSpecifier::Global: +    // Nothing more to add. +    break; + +  case NestedNameSpecifier::Identifier: +  case NestedNameSpecifier::Namespace: +  case NestedNameSpecifier::NamespaceAlias: +    // The location of the identifier or namespace name. +    Length += sizeof(unsigned); +    break; + +  case NestedNameSpecifier::TypeSpecWithTemplate: +  case NestedNameSpecifier::TypeSpec: +    // The "void*" that points at the TypeLoc data. +    // Note: the 'template' keyword is part of the TypeLoc. +    Length += sizeof(void *); +    break; +  } + +  return Length; +} + +unsigned  +NestedNameSpecifierLoc::getDataLength(NestedNameSpecifier *Qualifier) { +  unsigned Length = 0; +  for (; Qualifier; Qualifier = Qualifier->getPrefix()) +    Length += getLocalDataLength(Qualifier); +  return Length; +} + +namespace { +  /// \brief Load a (possibly unaligned) source location from a given address +  /// and offset. +  SourceLocation LoadSourceLocation(void *Data, unsigned Offset) { +    unsigned Raw; +    memcpy(&Raw, static_cast<char *>(Data) + Offset, sizeof(unsigned)); +    return SourceLocation::getFromRawEncoding(Raw); +  } +   +  /// \brief Load a (possibly unaligned) pointer from a given address and +  /// offset. +  void *LoadPointer(void *Data, unsigned Offset) { +    void *Result; +    memcpy(&Result, static_cast<char *>(Data) + Offset, sizeof(void*)); +    return Result; +  } +} + +SourceRange NestedNameSpecifierLoc::getSourceRange() const { +  if (!Qualifier) +    return SourceRange(); +   +  NestedNameSpecifierLoc First = *this; +  while (NestedNameSpecifierLoc Prefix = First.getPrefix()) +    First = Prefix; +   +  return SourceRange(First.getLocalSourceRange().getBegin(),  +                     getLocalSourceRange().getEnd()); +} + +SourceRange NestedNameSpecifierLoc::getLocalSourceRange() const { +  if (!Qualifier) +    return SourceRange(); +   +  unsigned Offset = getDataLength(Qualifier->getPrefix()); +  switch (Qualifier->getKind()) { +  case NestedNameSpecifier::Global: +    return LoadSourceLocation(Data, Offset); + +  case NestedNameSpecifier::Identifier: +  case NestedNameSpecifier::Namespace: +  case NestedNameSpecifier::NamespaceAlias: +    return SourceRange(LoadSourceLocation(Data, Offset), +                       LoadSourceLocation(Data, Offset + sizeof(unsigned))); + +  case NestedNameSpecifier::TypeSpecWithTemplate: +  case NestedNameSpecifier::TypeSpec: { +    // The "void*" that points at the TypeLoc data. +    // Note: the 'template' keyword is part of the TypeLoc. +    void *TypeData = LoadPointer(Data, Offset); +    TypeLoc TL(Qualifier->getAsType(), TypeData); +    return SourceRange(TL.getBeginLoc(), +                       LoadSourceLocation(Data, Offset + sizeof(void*))); +  } +  } +   +  return SourceRange(); +} + +TypeLoc NestedNameSpecifierLoc::getTypeLoc() const { +  assert((Qualifier->getKind() == NestedNameSpecifier::TypeSpec || +          Qualifier->getKind() == NestedNameSpecifier::TypeSpecWithTemplate) && +         "Nested-name-specifier location is not a type"); + +  // The "void*" that points at the TypeLoc data. +  unsigned Offset = getDataLength(Qualifier->getPrefix()); +  void *TypeData = LoadPointer(Data, Offset); +  return TypeLoc(Qualifier->getAsType(), TypeData); +} diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index cf14eba1405d..4ed031f97499 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -698,6 +698,25 @@ protected:    DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID); +  CharUnits getSize() const {  +    assert(Size % Context.getCharWidth() == 0); +    return Context.toCharUnitsFromBits(Size);  +  } +  uint64_t getSizeInBits() const { return Size; } + +  void setSize(CharUnits NewSize) { Size = Context.toBits(NewSize); } +  void setSize(uint64_t NewSize) { Size = NewSize; } + +  CharUnits getDataSize() const {  +    assert(DataSize % Context.getCharWidth() == 0); +    return Context.toCharUnitsFromBits(DataSize);  +  } +  uint64_t getDataSizeInBits() const { return DataSize; } + +  void setDataSize(CharUnits NewSize) { DataSize = Context.toBits(NewSize); } +  void setDataSize(uint64_t NewSize) { DataSize = NewSize; } + +    RecordLayoutBuilder(const RecordLayoutBuilder&);   // DO NOT IMPLEMENT    void operator=(const RecordLayoutBuilder&); // DO NOT IMPLEMENT  public: @@ -796,8 +815,8 @@ void RecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {    assert(DataSize == 0 && "Vtable pointer must be at offset zero!");    // Update the size. -  Size += GetVirtualPointersSize(RD); -  DataSize = Size; +  setSize(getSizeInBits() + GetVirtualPointersSize(RD)); +  setDataSize(getSizeInBits());    CharUnits UnpackedBaseAlign =       Context.toCharUnitsFromBits(Context.Target.getPointerAlign(0)); @@ -1090,7 +1109,7 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {    if (Base->Class->isEmpty() &&        EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) {      uint64_t RecordSizeInBits = Context.toBits(Layout.getSize()); -    Size = std::max(Size, RecordSizeInBits); +    setSize(std::max(getSizeInBits(), RecordSizeInBits));      return CharUnits::Zero();    } @@ -1106,7 +1125,7 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {    // Round up the current record size to the base's alignment boundary.    uint64_t Offset =  -    llvm::RoundUpToAlignment(DataSize, Context.toBits(BaseAlign)); +    llvm::RoundUpToAlignment(getDataSizeInBits(), Context.toBits(BaseAlign));    // Try to place the base.    while (!EmptySubobjects->CanPlaceBaseAtOffset(Base,  @@ -1115,11 +1134,12 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {    if (!Base->Class->isEmpty()) {      // Update the data size. -    DataSize = Offset + Context.toBits(Layout.getNonVirtualSize()); +    setDataSize(Offset + Context.toBits(Layout.getNonVirtualSize())); -    Size = std::max(Size, DataSize); +    setSize(std::max(getSizeInBits(), getDataSizeInBits()));    } else -    Size = std::max(Size, Offset + Context.toBits(Layout.getSize())); +    setSize(std::max(getSizeInBits(),  +                     Offset + Context.toBits(Layout.getSize())));    // Remember max struct/class alignment.    UpdateAlignment(BaseAlign, UnpackedBaseAlign); @@ -1167,7 +1187,8 @@ void RecordLayoutBuilder::Layout(const CXXRecordDecl *RD) {    LayoutFields(RD); -  NonVirtualSize = Context.toCharUnitsFromBits(Size); +  // FIXME: Size isn't always an exact multiple of the char width. Round up? +  NonVirtualSize = Context.toCharUnitsFromBits(getSizeInBits());    NonVirtualAlignment = Alignment;    // Lay out the virtual bases and add the primary virtual base offsets. @@ -1211,8 +1232,8 @@ void RecordLayoutBuilder::Layout(const ObjCInterfaceDecl *D) {      // We start laying out ivars not at the end of the superclass      // structure, but at the next byte following the last field. -    Size = Context.toBits(SL.getDataSize()); -    DataSize = Size; +    setSize(SL.getDataSize()); +    setDataSize(getSizeInBits());    }    InitializeLayout(D); @@ -1270,20 +1291,20 @@ void RecordLayoutBuilder::LayoutWideBitField(uint64_t FieldSize,    UnfilledBitsInLastByte = 0;    uint64_t FieldOffset; -  uint64_t UnpaddedFieldOffset = DataSize - UnfilledBitsInLastByte; +  uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastByte;    if (IsUnion) { -    DataSize = std::max(DataSize, FieldSize); +    setDataSize(std::max(getDataSizeInBits(), FieldSize));      FieldOffset = 0;    } else {      // The bitfield is allocated starting at the next offset aligned appropriately      // for T', with length n bits. -    FieldOffset = llvm::RoundUpToAlignment(DataSize, TypeAlign); +    FieldOffset = llvm::RoundUpToAlignment(getDataSizeInBits(), TypeAlign);      uint64_t NewSizeInBits = FieldOffset + FieldSize; -    DataSize = llvm::RoundUpToAlignment(NewSizeInBits, 8); -    UnfilledBitsInLastByte = DataSize - NewSizeInBits; +    setDataSize(llvm::RoundUpToAlignment(NewSizeInBits, 8)); +    UnfilledBitsInLastByte = getDataSizeInBits() - NewSizeInBits;    }    // Place this field at the current location. @@ -1293,7 +1314,7 @@ void RecordLayoutBuilder::LayoutWideBitField(uint64_t FieldSize,                      TypeAlign, FieldPacked, D);    // Update the size. -  Size = std::max(Size, DataSize); +  setSize(std::max(getSizeInBits(), getDataSizeInBits()));    // Remember max struct/class alignment.    UpdateAlignment(Context.toCharUnitsFromBits(TypeAlign)); @@ -1301,7 +1322,7 @@ void RecordLayoutBuilder::LayoutWideBitField(uint64_t FieldSize,  void RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {    bool FieldPacked = Packed || D->hasAttr<PackedAttr>(); -  uint64_t UnpaddedFieldOffset = DataSize - UnfilledBitsInLastByte; +  uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastByte;    uint64_t FieldOffset = IsUnion ? 0 : UnpaddedFieldOffset;    uint64_t FieldSize = D->getBitWidth()->EvaluateAsInt(Context).getZExtValue(); @@ -1355,16 +1376,16 @@ void RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {    // Update DataSize to include the last byte containing (part of) the bitfield.    if (IsUnion) {      // FIXME: I think FieldSize should be TypeSize here. -    DataSize = std::max(DataSize, FieldSize); +    setDataSize(std::max(getDataSizeInBits(), FieldSize));    } else {      uint64_t NewSizeInBits = FieldOffset + FieldSize; -    DataSize = llvm::RoundUpToAlignment(NewSizeInBits, 8); -    UnfilledBitsInLastByte = DataSize - NewSizeInBits; +    setDataSize(llvm::RoundUpToAlignment(NewSizeInBits, 8)); +    UnfilledBitsInLastByte = getDataSizeInBits() - NewSizeInBits;    }    // Update the size. -  Size = std::max(Size, DataSize); +  setSize(std::max(getSizeInBits(), getDataSizeInBits()));    // Remember max struct/class alignment.    UpdateAlignment(Context.toCharUnitsFromBits(FieldAlign),  @@ -1377,14 +1398,14 @@ void RecordLayoutBuilder::LayoutField(const FieldDecl *D) {      return;    } -  uint64_t UnpaddedFieldOffset = DataSize - UnfilledBitsInLastByte; +  uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastByte;    // Reset the unfilled bits.    UnfilledBitsInLastByte = 0;    bool FieldPacked = Packed || D->hasAttr<PackedAttr>();    CharUnits FieldOffset =  -    IsUnion ? CharUnits::Zero() : Context.toCharUnitsFromBits(DataSize); +    IsUnion ? CharUnits::Zero() : getDataSize();    CharUnits FieldSize;    CharUnits FieldAlign; @@ -1464,12 +1485,12 @@ void RecordLayoutBuilder::LayoutField(const FieldDecl *D) {    // Reserve space for this field.    uint64_t FieldSizeInBits = Context.toBits(FieldSize);    if (IsUnion) -    Size = std::max(Size, FieldSizeInBits); +    setSize(std::max(getSizeInBits(), FieldSizeInBits));    else -    Size = Context.toBits(FieldOffset) + FieldSizeInBits; +    setSize(Context.toBits(FieldOffset) + FieldSizeInBits);    // Update the data size. -  DataSize = Size; +  setDataSize(getSizeInBits());    // Remember max struct/class alignment.    UpdateAlignment(FieldAlign, UnpackedFieldAlign); @@ -1477,29 +1498,30 @@ void RecordLayoutBuilder::LayoutField(const FieldDecl *D) {  void RecordLayoutBuilder::FinishLayout(const NamedDecl *D) {    // In C++, records cannot be of size 0. -  if (Context.getLangOptions().CPlusPlus && Size == 0) { +  if (Context.getLangOptions().CPlusPlus && getSizeInBits() == 0) {      if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {        // Compatibility with gcc requires a class (pod or non-pod)        // which is not empty but of size 0; such as having fields of        // array of zero-length, remains of Size 0        if (RD->isEmpty()) -        Size = 8; +        setSize(8);      }      else -      Size = 8; +      setSize(8);    }    // Finally, round the size of the record up to the alignment of the    // record itself. -  uint64_t UnpaddedSize = Size - UnfilledBitsInLastByte; +  uint64_t UnpaddedSize = getSizeInBits() - UnfilledBitsInLastByte;    uint64_t UnpackedSize =  -    llvm::RoundUpToAlignment(Size, Context.toBits(UnpackedAlignment)); -  Size = llvm::RoundUpToAlignment(Size, Context.toBits(Alignment)); +    llvm::RoundUpToAlignment(getSizeInBits(),  +                             Context.toBits(UnpackedAlignment)); +  setSize(llvm::RoundUpToAlignment(getSizeInBits(), Context.toBits(Alignment)));    unsigned CharBitNum = Context.Target.getCharWidth();    if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {      // Warn if padding was introduced to the struct/class/union. -    if (Size > UnpaddedSize) { -      unsigned PadSize = Size - UnpaddedSize; +    if (getSizeInBits() > UnpaddedSize) { +      unsigned PadSize = getSizeInBits() - UnpaddedSize;        bool InBits = true;        if (PadSize % CharBitNum == 0) {          PadSize = PadSize / CharBitNum; @@ -1513,7 +1535,8 @@ void RecordLayoutBuilder::FinishLayout(const NamedDecl *D) {      // Warn if we packed it unnecessarily. If the alignment is 1 byte don't      // bother since there won't be alignment issues. -    if (Packed && UnpackedAlignment > CharUnits::One() && Size == UnpackedSize) +    if (Packed && UnpackedAlignment > CharUnits::One() &&  +        getSizeInBits() == UnpackedSize)        Diag(D->getLocation(), diag::warn_unnecessary_packed)            << Context.getTypeDeclType(RD);    } diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 7e73f02e67e7..8a80275aa165 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -218,6 +218,10 @@ unsigned AsmStmt::getNumPlusOperands() const {  Expr *AsmStmt::getInputExpr(unsigned i) {    return cast<Expr>(Exprs[i + NumOutputs]);  } +void AsmStmt::setInputExpr(unsigned i, Expr *E) { +  Exprs[i + NumOutputs] = E; +} +  /// getInputConstraint - Return the specified input constraint.  Unlike output  /// constraints, these can be empty. diff --git a/lib/AST/StmtDumper.cpp b/lib/AST/StmtDumper.cpp index 846bd4ce1441..5c7dbb3ed990 100644 --- a/lib/AST/StmtDumper.cpp +++ b/lib/AST/StmtDumper.cpp @@ -279,8 +279,8 @@ void StmtDumper::DumpDeclarator(Decl *D) {      // print using decl (e.g. "using std::string;")      const char *tn = UD->isTypeName() ? "typename " : "";      OS << '"' << UD->getDeclKindName() << tn; -    UD->getTargetNestedNameDecl()->print(OS, -        PrintingPolicy(UD->getASTContext().getLangOptions())); +    UD->getQualifier()->print(OS, +                        PrintingPolicy(UD->getASTContext().getLangOptions()));      OS << ";\"";    } else if (LabelDecl *LD = dyn_cast<LabelDecl>(D)) {      OS << "label " << LD->getNameAsString(); diff --git a/lib/AST/TemplateBase.cpp b/lib/AST/TemplateBase.cpp index 5ab5f4644c88..1764f4ab1f03 100644 --- a/lib/AST/TemplateBase.cpp +++ b/lib/AST/TemplateBase.cpp @@ -24,8 +24,6 @@  #include "llvm/ADT/FoldingSet.h"  #include <algorithm>  #include <cctype> -#include <iomanip> -#include <sstream>  using namespace clang; @@ -42,17 +40,11 @@ static void printIntegral(const TemplateArgument &TemplArg,    if (T->isBooleanType()) {      Out << (Val->getBoolValue() ? "true" : "false");    } else if (T->isCharType()) { -    char Ch = Val->getSExtValue(); -    if (std::isprint(Ch)) { -      Out << "'"; -      if (Ch == '\'' || Ch == '\\') -        Out << '\\'; -      Out << Ch << "'"; -    } else { -      std::ostringstream Str; -      Str << std::setw(2) << std::setfill('0') << std::hex << (int)Ch; -      Out << "'\\x" << Str.str() << "'"; -    } +    const unsigned char Ch = Val->getZExtValue(); +    const std::string Str(1, Ch); +    Out << ((Ch == '\'') ? "'\\" : "'"); +    Out.write_escaped(Str, /*UseHexEscapes=*/ true); +    Out << "'";    } else {      Out << Val->toString(10);    } | 
