diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-21 23:17:49 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-21 23:17:49 +0000 |
commit | 9ea62768fca25d829d80199cf4f8cf0f4dd39251 (patch) | |
tree | 148d110e673fdd610e2b177e8c2fadccac5ffc45 /lib/Sema/SemaInit.cpp | |
parent | ccb97f52afeb4ce5b239a6f3b44956d9e220e5e3 (diff) |
Template instantiation for C99 designated initializers, because we
can. Also, delay semantic analysis of initialization for
value-dependent as well as type-dependent expressions, since we can't
always properly type-check a value-dependent expression.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72233 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r-- | lib/Sema/SemaInit.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index f3ad2a1b32..126b3869fe 100644 --- a/lib/Sema/SemaInit.cpp +++ b/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()); |