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 | ca1aeecd375ac3eb76cf872f38db2837c117cd2b (patch) | |
| tree | 097953d42fca161604fdb8230ad731e718568623 /clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | |
| parent | 4ff70e389e97225729c2c6a1e52b21002cbcac87 (diff) | |
| download | bcm5719-llvm-ca1aeecd375ac3eb76cf872f38db2837c117cd2b.tar.gz bcm5719-llvm-ca1aeecd375ac3eb76cf872f38db2837c117cd2b.zip | |
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.
llvm-svn: 72233
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiateExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 61 |
1 files changed, 59 insertions, 2 deletions
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(); |

