]> granicus.if.org Git - clang/commitdiff
Template instantiation for initializer lists
authorDouglas Gregor <dgregor@apple.com>
Thu, 21 May 2009 21:38:12 +0000 (21:38 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 21 May 2009 21:38:12 +0000 (21:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72229 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateInstantiateExpr.cpp
test/SemaTemplate/instantiate-expr-4.cpp

index 8cd60edb67198ecd39e29f2d2f76c96ffaac1066..283b0d35a20c2713d7f228b9799acfa084a053c9 100644 (file)
@@ -60,7 +60,7 @@ namespace {
     OwningExprResult VisitShuffleVectorExpr(ShuffleVectorExpr *E);
     OwningExprResult VisitChooseExpr(ChooseExpr *E);
     OwningExprResult VisitVAArgExpr(VAArgExpr *E);
-    // FIXME: InitListExpr
+    OwningExprResult VisitInitListExpr(InitListExpr *E);
     // FIXME: DesignatedInitExpr
     // FIXME: ImplicitValueInitExpr
     // FIXME: ExtVectorElementExpr
@@ -580,6 +580,20 @@ Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
                             T.getAsOpaquePtr(), E->getRParenLoc());
 }
 
+Sema::OwningExprResult 
+TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
+  ExprVector Inits(SemaRef);
+  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
+    OwningExprResult Init = Visit(E->getInit(I));
+    if (Init.isInvalid())
+      return SemaRef.ExprError();
+    Inits.push_back(Init.takeAs<Expr>());
+  }
+
+  return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
+                               E->getRBraceLoc());
+}
+
 Sema::OwningExprResult 
 TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
   bool isSizeOf = E->isSizeOf();
index 5c32d8c1976a055cf817bb4f80aed71b744b42f4..09d574176ac1801bfb6bb6519bcfcaf4fa13a6d0 100644 (file)
@@ -150,3 +150,31 @@ struct is_pod {
 
 static const int is_pod0[is_pod<X>::value? -1 : 1];
 static const int is_pod1[is_pod<Y>::value? 1 : -1];
+
+// ---------------------------------------------------------------------
+// initializer lists
+// ---------------------------------------------------------------------
+template<typename T, typename Val1>
+struct InitList1 {
+  void f(Val1 val1) { 
+    T x = { val1 };
+  }
+};
+
+struct APair {
+  int *x;
+  const float *y;
+};
+
+template struct InitList1<int[1], float>;
+template struct InitList1<APair, int*>;
+
+template<typename T, typename Val1, typename Val2>
+struct InitList2 {
+  void f(Val1 val1, Val2 val2) { 
+    T x = { val1, val2 }; // expected-error{{incompatible}}
+  }
+};
+
+template struct InitList2<APair, int*, float*>;
+template struct InitList2<APair, int*, double*>; // expected-note{{instantiation}}