Implement template instantiation for several more kinds of expressions:
  - C++ function casts, e.g., T(foo)
  - sizeof(), alignof()

More importantly, this allows us to verify that we're performing
overload resolution during template instantiation, with
argument-dependent lookup and the "cached" results of name lookup from
the template definition.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66947 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 501eda7..e5a2520 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -122,6 +122,13 @@
   SourceLocation TyBeginLoc = TypeRange.getBegin();
   SourceRange FullRange = SourceRange(TyBeginLoc, RParenLoc);
 
+  if (Ty->isDependentType() || 
+      CallExpr::hasAnyTypeDependentArguments(Exprs, NumExprs)) {
+    return new (Context) CXXTemporaryObjectExpr(0, Ty, TyBeginLoc,
+                                                Exprs, NumExprs, RParenLoc);
+  }
+
+
   // C++ [expr.type.conv]p1:
   // If the expression list is a single expression, the type conversion
   // expression is equivalent (in definedness, and if defined in meaning) to the
@@ -134,8 +141,6 @@
                                                TyBeginLoc, Exprs[0], RParenLoc);
   }
 
-  // FIXME: What AST node to create when the type is dependent?
-
   if (const RecordType *RT = Ty->getAsRecordType()) {
     CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl());