diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-21 23:30:39 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-21 23:30:39 +0000 |
commit | c4bb7bfe8328f79004517dd268f6146c8066c205 (patch) | |
tree | 522cb54bdf9cc82e97db5b496cf077181aee2677 /lib/Sema | |
parent | 9ea62768fca25d829d80199cf4f8cf0f4dd39251 (diff) |
Template instantiation for GNU array-range designators.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72234 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaInit.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 17 |
2 files changed, 17 insertions, 2 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 126b3869fe..d880c236d2 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -1672,7 +1672,7 @@ Sema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, else if (StartValue.getBitWidth() < EndValue.getBitWidth()) StartValue.extend(EndValue.getBitWidth()); - if (EndValue < StartValue) { + if (!StartDependent && !EndDependent && EndValue < StartValue) { Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range) << StartValue.toString(10) << EndValue.toString(10) << StartIndex->getSourceRange() << EndIndex->getSourceRange(); diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 38f9245721..14eef13f8d 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -628,7 +628,22 @@ TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) { continue; } - assert(false && "No array range designators, yet"); + assert(D->isArrayRangeDesignator() && "New kind of designator?"); + OwningExprResult Start = Visit(E->getArrayRangeStart(*D)); + if (Start.isInvalid()) + return SemaRef.ExprError(); + + OwningExprResult End = Visit(E->getArrayRangeEnd(*D)); + if (End.isInvalid()) + return SemaRef.ExprError(); + + Desig.AddDesignator(Designator::getArrayRange(Start.get(), + End.get(), + D->getLBracketLoc(), + D->getEllipsisLoc())); + + ArrayExprs.push_back(Start.release()); + ArrayExprs.push_back(End.release()); } OwningExprResult Result = |