diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 77 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 21 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 61 | 
3 files changed, 124 insertions, 35 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 2df76a29048..81936efb086 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -385,7 +385,9 @@ OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {  InitListExpr::InitListExpr(SourceLocation lbraceloc,                              Expr **initExprs, unsigned numInits,                             SourceLocation rbraceloc) -  : Expr(InitListExprClass, QualType()), +  : Expr(InitListExprClass, QualType(), +         hasAnyTypeDependentArguments(initExprs, numInits), +         hasAnyValueDependentArguments(initExprs, numInits)),      LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),       UnionFieldInit(0), HadArrayRangeDesignator(false) { @@ -1632,13 +1634,48 @@ DesignatedInitExpr::DesignatedInitExpr(QualType Ty, unsigned NumDesignators,                                         const Designator *Designators,                                         SourceLocation EqualOrColonLoc,                                          bool GNUSyntax, -                                       unsigned NumSubExprs) -  : Expr(DesignatedInitExprClass, Ty),  +                                       Expr **IndexExprs,  +                                       unsigned NumIndexExprs, +                                       Expr *Init) +  : Expr(DesignatedInitExprClass, Ty,  +         Init->isTypeDependent(), Init->isValueDependent()),      EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),  -    NumDesignators(NumDesignators), NumSubExprs(NumSubExprs) {  +    NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {     this->Designators = new Designator[NumDesignators]; -  for (unsigned I = 0; I != NumDesignators; ++I) + +  // Record the initializer itself. +  child_iterator Child = child_begin(); +  *Child++ = Init; + +  // Copy the designators and their subexpressions, computing +  // value-dependence along the way. +  unsigned IndexIdx = 0; +  for (unsigned I = 0; I != NumDesignators; ++I) {      this->Designators[I] = Designators[I]; + +    if (this->Designators[I].isArrayDesignator()) { +      // Compute type- and value-dependence. +      Expr *Index = IndexExprs[IndexIdx]; +      ValueDependent = ValueDependent ||  +        Index->isTypeDependent() || Index->isValueDependent(); + +      // Copy the index expressions into permanent storage. +      *Child++ = IndexExprs[IndexIdx++]; +    } else if (this->Designators[I].isArrayRangeDesignator()) { +      // Compute type- and value-dependence. +      Expr *Start = IndexExprs[IndexIdx]; +      Expr *End = IndexExprs[IndexIdx + 1]; +      ValueDependent = ValueDependent ||  +        Start->isTypeDependent() || Start->isValueDependent() || +        End->isTypeDependent() || End->isValueDependent(); + +      // Copy the start/end expressions into permanent storage. +      *Child++ = IndexExprs[IndexIdx++]; +      *Child++ = IndexExprs[IndexIdx++]; +    } +  } + +  assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions");  }  DesignatedInitExpr * @@ -1649,29 +1686,9 @@ DesignatedInitExpr::Create(ASTContext &C, Designator *Designators,                             bool UsesColonSyntax, Expr *Init) {    void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +                           sizeof(Stmt *) * (NumIndexExprs + 1), 8); -  DesignatedInitExpr *DIE  -    = new (Mem) DesignatedInitExpr(C.VoidTy, NumDesignators, Designators, -                                   ColonOrEqualLoc, UsesColonSyntax, -                                   NumIndexExprs + 1); - -  // Fill in the designators -  unsigned ExpectedNumSubExprs = 0; -  designators_iterator Desig = DIE->designators_begin(); -  for (unsigned Idx = 0; Idx < NumDesignators; ++Idx, ++Desig) { -    if (Designators[Idx].isArrayDesignator()) -      ++ExpectedNumSubExprs; -    else if (Designators[Idx].isArrayRangeDesignator()) -      ExpectedNumSubExprs += 2; -  } -  assert(ExpectedNumSubExprs == NumIndexExprs && "Wrong number of indices!"); - -  // Fill in the subexpressions, including the initializer expression. -  child_iterator Child = DIE->child_begin(); -  *Child++ = Init; -  for (unsigned Idx = 0; Idx < NumIndexExprs; ++Idx, ++Child) -    *Child = IndexExprs[Idx]; - -  return DIE; +  return new (Mem) DesignatedInitExpr(C.VoidTy, NumDesignators, Designators, +                                      ColonOrEqualLoc, UsesColonSyntax, +                                      IndexExprs, NumIndexExprs, Init);  }  DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C,  @@ -1766,6 +1783,10 @@ void DesignatedInitExpr::Destroy(ASTContext &C) {    Expr::Destroy(C);  } +ImplicitValueInitExpr *ImplicitValueInitExpr::Clone(ASTContext &C) const { +  return new (C) ImplicitValueInitExpr(getType()); +} +  //===----------------------------------------------------------------------===//  //  ExprIterator.  //===----------------------------------------------------------------------===// diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index f3ad2a1b326..126b3869fe0 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -117,7 +117,8 @@ bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType,                                   SourceLocation InitLoc,                                   DeclarationName InitEntity,                                   bool DirectInit) { -  if (DeclType->isDependentType() || Init->isTypeDependent()) +  if (DeclType->isDependentType() ||  +      Init->isTypeDependent() || Init->isValueDependent())      return false;    // C++ [dcl.init.ref]p1: @@ -1635,7 +1636,9 @@ Sema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,      case Designator::ArrayDesignator: {        Expr *Index = static_cast<Expr *>(D.getArrayIndex());        llvm::APSInt IndexValue; -      if (CheckArrayDesignatorExpr(*this, Index, IndexValue)) +      if (!Index->isTypeDependent() && +          !Index->isValueDependent() && +          CheckArrayDesignatorExpr(*this, Index, IndexValue))          Invalid = true;        else {          Designators.push_back(ASTDesignator(InitExpressions.size(), @@ -1651,12 +1654,20 @@ Sema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,        Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd());        llvm::APSInt StartValue;        llvm::APSInt EndValue; -      if (CheckArrayDesignatorExpr(*this, StartIndex, StartValue) || -          CheckArrayDesignatorExpr(*this, EndIndex, EndValue)) +      bool StartDependent = StartIndex->isTypeDependent() || +                            StartIndex->isValueDependent(); +      bool EndDependent = EndIndex->isTypeDependent() || +                          EndIndex->isValueDependent(); +      if ((!StartDependent && +           CheckArrayDesignatorExpr(*this, StartIndex, StartValue)) || +          (!EndDependent && +           CheckArrayDesignatorExpr(*this, EndIndex, EndValue)))          Invalid = true;        else {          // Make sure we're comparing values with the same bit width. -        if (StartValue.getBitWidth() > EndValue.getBitWidth()) +        if (StartDependent || EndDependent) { +          // Nothing to compute. +        } else if (StartValue.getBitWidth() > EndValue.getBitWidth())            EndValue.extend(StartValue.getBitWidth());          else if (StartValue.getBitWidth() < EndValue.getBitWidth())            StartValue.extend(EndValue.getBitWidth()); diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index 283b0d35a20..38f92457218 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -16,6 +16,7 @@  #include "clang/AST/Expr.h"  #include "clang/AST/ExprCXX.h"  #include "clang/Parse/DeclSpec.h" +#include "clang/Parse/Designator.h"  #include "clang/Lex/Preprocessor.h" // for the identifier table  #include "llvm/Support/Compiler.h"  using namespace clang; @@ -61,8 +62,8 @@ namespace {      OwningExprResult VisitChooseExpr(ChooseExpr *E);      OwningExprResult VisitVAArgExpr(VAArgExpr *E);      OwningExprResult VisitInitListExpr(InitListExpr *E); -    // FIXME: DesignatedInitExpr -    // FIXME: ImplicitValueInitExpr +    OwningExprResult VisitDesignatedInitExpr(DesignatedInitExpr *E); +    OwningExprResult VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);      // FIXME: ExtVectorElementExpr      // FIXME: BlockExpr      // FIXME: BlockDeclRefExpr @@ -595,6 +596,62 @@ TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {  }  Sema::OwningExprResult  +TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) { +  Designation Desig; + +  // Instantiate the initializer value +  OwningExprResult Init = Visit(E->getInit()); +  if (Init.isInvalid()) +    return SemaRef.ExprError(); + +  // Instantiate the designators. +  ExprVector ArrayExprs(SemaRef); // Expresses used in array designators +  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), +                                             DEnd = E->designators_end(); +       D != DEnd; ++D) { +    if (D->isFieldDesignator()) { +      Desig.AddDesignator(Designator::getField(D->getFieldName(), +                                               D->getDotLoc(), +                                               D->getFieldLoc())); +      continue; +    } + +    if (D->isArrayDesignator()) { +      OwningExprResult Index = Visit(E->getArrayIndex(*D)); +      if (Index.isInvalid()) +        return SemaRef.ExprError(); + +      Desig.AddDesignator(Designator::getArray(Index.get(),  +                                               D->getLBracketLoc())); + +      ArrayExprs.push_back(Index.release()); +      continue; +    } + +    assert(false && "No array range designators, yet"); +  } + +  OwningExprResult Result =  +    SemaRef.ActOnDesignatedInitializer(Desig, +                                       E->getEqualOrColonLoc(), +                                       E->usesGNUSyntax(), +                                       move(Init)); +  if (Result.isInvalid()) +    return SemaRef.ExprError(); + +  ArrayExprs.take(); +  return move(Result); +} + +Sema::OwningExprResult  +TemplateExprInstantiator::VisitImplicitValueInitExpr( +                                                  ImplicitValueInitExpr *E) { +  assert(!E->isTypeDependent() && !E->isValueDependent() && +         "ImplicitValueInitExprs are never dependent"); +  return SemaRef.Clone(E); +} + +Sema::OwningExprResult   TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {    bool isSizeOf = E->isSizeOf();  | 

