summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-05-21 23:17:49 +0000
committerDouglas Gregor <dgregor@apple.com>2009-05-21 23:17:49 +0000
commitca1aeecd375ac3eb76cf872f38db2837c117cd2b (patch)
tree097953d42fca161604fdb8230ad731e718568623 /clang/lib/Sema/SemaTemplateInstantiateExpr.cpp
parent4ff70e389e97225729c2c6a1e52b21002cbcac87 (diff)
downloadbcm5719-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.cpp61
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();
OpenPOWER on IntegriCloud