From: Douglas Gregor Date: Tue, 19 May 2009 23:29:16 +0000 (+0000) Subject: Add FIXMEs for the remaining C and C++ expression types that still X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0529519a9feb1995ba88d179197454103b758866;p=clang Add FIXMEs for the remaining C and C++ expression types that still need template instantiation logic. Remove one FIXME by instantiating the callee in a non-type-dependent CXXOperatorCallExpr. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72145 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 56126d4504..a0e2941e26 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -60,6 +60,12 @@ namespace { OwningExprResult VisitShuffleVectorExpr(ShuffleVectorExpr *E); OwningExprResult VisitChooseExpr(ChooseExpr *E); OwningExprResult VisitVAArgExpr(VAArgExpr *E); + // FIXME: InitListExpr + // FIXME: DesignatedInitExpr + // FIXME: ImplicitValueInitExpr + // FIXME: ExtVectorElementExpr + // FIXME: BlockExpr + // FIXME: BlockDeclRefExpr OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E); OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); @@ -67,6 +73,7 @@ namespace { OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E); OwningExprResult VisitExplicitCastExpr(ExplicitCastExpr *E); OwningExprResult VisitCStyleCastExpr(CStyleCastExpr *E); + // FIXME: CXXMemberCallExpr OwningExprResult VisitCXXNamedCastExpr(CXXNamedCastExpr *E); OwningExprResult VisitCXXStaticCastExpr(CXXStaticCastExpr *E); OwningExprResult VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E); @@ -75,6 +82,17 @@ namespace { OwningExprResult VisitCXXThisExpr(CXXThisExpr *E); OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E); + // FIXME: CXXTypeIdExpr + // FIXME: CXXThrowExpr + // FIXME: CXXDefaultArgExpr + // FIXME: CXXConstructExpr + // FIXME: CXXFunctionalCastExpr + // FIXME: CXXZeroInitValueExpr + // FIXME: CXXNewExpr + // FIXME: CXXDeleteExpr + // FIXME: UnaryTypeTraitExpr + // FIXME: QualifiedDeclRefExpr + // FIXME: CXXExprWithTemporaries OwningExprResult VisitGNUNullExpr(GNUNullExpr *E); OwningExprResult VisitUnresolvedFunctionNameExpr( UnresolvedFunctionNameExpr *E); @@ -324,13 +342,17 @@ TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { // perform lookup again at instantiation time (C++ [temp.dep]p1). // Instead, we just build the new overloaded operator call // expression. + OwningExprResult Callee = Visit(E->getCallee()); + if (Callee.isInvalid()) + return SemaRef.ExprError(); + First.release(); Second.release(); - // FIXME: Don't reuse the callee here. We need to instantiate it. + return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr( SemaRef.Context, E->getOperator(), - E->getCallee(), + Callee.takeAs(), Args, E->getNumArgs(), E->getType(), E->getOperatorLoc())); diff --git a/test/SemaTemplate/instantiate-expr-3.cpp b/test/SemaTemplate/instantiate-expr-3.cpp index 7032b1dfdf..87f303057f 100644 --- a/test/SemaTemplate/instantiate-expr-3.cpp +++ b/test/SemaTemplate/instantiate-expr-3.cpp @@ -102,7 +102,7 @@ template struct Choose0; template struct Choose0; // expected-note{{instantiation}} // --------------------------------------------------------------------- -// va_arg +// __builtin_va_arg // --------------------------------------------------------------------- template struct VaArg0 { @@ -116,3 +116,22 @@ struct VaArg0 { }; template struct VaArg0; + +// --------------------------------------------------------------------- +// Vector element expressions +// --------------------------------------------------------------------- +#if 0 +// Not supported until we have full support for MemberExpr. +typedef __attribute__(( ext_vector_type(2) )) double double2; +typedef __attribute__(( ext_vector_type(4) )) double double4; + +template +struct VectorElem0 { + void f(T t, U u) { + t.xy = u.zw; + } +}; + +template struct VectorElem0; +template struct VectorElem0; +#endif