[cfe-commits] r72236 - in /cfe/trunk: lib/Sema/SemaExpr.cpp lib/Sema/SemaTemplateInstantiateExpr.cpp lib/Sema/SemaType.cpp test/SemaTemplate/instantiate-c99.cpp

Douglas Gregor dgregor at apple.com
Thu May 21 16:48:19 PDT 2009


Author: dgregor
Date: Thu May 21 18:48:18 2009
New Revision: 72236

URL: http://llvm.org/viewvc/llvm-project?rev=72236&view=rev
Log:
Template instantiation for C99 compound literals

Modified:
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp
    cfe/trunk/lib/Sema/SemaType.cpp
    cfe/trunk/test/SemaTemplate/instantiate-c99.cpp

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=72236&r1=72235&r2=72236&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu May 21 18:48:18 2009
@@ -2719,8 +2719,9 @@
     if (literalType->isVariableArrayType())
       return ExprError(Diag(LParenLoc, diag::err_variable_object_no_init)
         << SourceRange(LParenLoc, literalExpr->getSourceRange().getEnd()));
-  } else if (RequireCompleteType(LParenLoc, literalType,
-                                    diag::err_typecheck_decl_incomplete_type,
+  } else if (!literalType->isDependentType() &&
+             RequireCompleteType(LParenLoc, literalType,
+                                 diag::err_typecheck_decl_incomplete_type,
                 SourceRange(LParenLoc, literalExpr->getSourceRange().getEnd())))
     return ExprError();
 

Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp?rev=72236&r1=72235&r2=72236&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateExpr.cpp Thu May 21 18:48:18 2009
@@ -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())

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=72236&r1=72235&r2=72236&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Thu May 21 18:48:18 2009
@@ -1090,6 +1090,12 @@
 bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, unsigned diag,
                                SourceRange Range1, SourceRange Range2,
                                QualType PrintType) {
+  // FIXME: Add this assertion to help us flush out problems with
+  // checking for dependent types and type-dependent expressions.
+  //
+  //  assert(!T->isDependentType() && 
+  //         "Can't ask whether a dependent type is complete");
+
   // If we have a complete type, we're done.
   if (!T->isIncompleteType())
     return false;

Modified: cfe/trunk/test/SemaTemplate/instantiate-c99.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-c99.cpp?rev=72236&r1=72235&r2=72236&view=diff

==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-c99.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-c99.cpp Thu May 21 18:48:18 2009
@@ -67,3 +67,15 @@
 
 template struct DesigArrayRangeInit0<int[8], 3, 5, float>;
 template struct DesigArrayRangeInit0<int[8], 5, 13, float>; // expected-note{{instantiation}}
+
+// ---------------------------------------------------------------------
+// Compound literals
+// ---------------------------------------------------------------------
+template<typename T, typename Arg1, typename Arg2>
+struct CompoundLiteral0 {
+  T f(Arg1 a1, Arg2 a2) {
+    return (T){a1, a2};
+  }
+};
+
+template struct CompoundLiteral0<Point2D, int, float>;





More information about the cfe-commits mailing list