Template instantiation for C99 compound literals

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72236 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp
index 14eef13..fd88b93 100644
--- a/lib/Sema/SemaTemplateInstantiateExpr.cpp
+++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp
@@ -49,7 +49,7 @@
     OwningExprResult VisitArraySubscriptExpr(ArraySubscriptExpr *E);
     OwningExprResult VisitCallExpr(CallExpr *E);
     // FIXME: VisitMemberExpr
-    // FIXME: CompoundLiteralExpr
+    OwningExprResult VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
     OwningExprResult VisitBinaryOperator(BinaryOperator *E);
     OwningExprResult VisitCompoundAssignOperator(CompoundAssignOperator *E);
     OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
@@ -289,6 +289,26 @@
 }
 
 Sema::OwningExprResult 
+TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
+  SourceLocation FakeTypeLoc 
+    = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
+  QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
+                                       FakeTypeLoc,
+                                       DeclarationName());
+  if (T.isNull())
+    return SemaRef.ExprError();
+
+  OwningExprResult Init = Visit(E->getInitializer());
+  if (Init.isInvalid())
+    return SemaRef.ExprError();
+
+  return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
+                                      T.getAsOpaquePtr(),
+                                      /*FIXME*/E->getLParenLoc(),
+                                      move(Init));
+}
+
+Sema::OwningExprResult 
 TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
   Sema::OwningExprResult LHS = Visit(E->getLHS());
   if (LHS.isInvalid())