diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-19 23:29:16 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-19 23:29:16 +0000 |
commit | 0529519a9feb1995ba88d179197454103b758866 (patch) | |
tree | 1248384f6e7f79fbf4de7a990a0dc1414b8b615e | |
parent | dd0273078111ec7312172c456a01ff86bff83b23 (diff) |
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
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 26 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-expr-3.cpp | 21 |
2 files changed, 44 insertions, 3 deletions
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<Expr>(), 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<false, int, float, float&>; template struct Choose0<true, int, float, float&>; // expected-note{{instantiation}} // --------------------------------------------------------------------- -// va_arg +// __builtin_va_arg // --------------------------------------------------------------------- template<typename ArgType> struct VaArg0 { @@ -116,3 +116,22 @@ struct VaArg0 { }; template struct VaArg0<int>; + +// --------------------------------------------------------------------- +// 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<typename T, typename U> +struct VectorElem0 { + void f(T t, U u) { + t.xy = u.zw; + } +}; + +template struct VectorElem0<double2, double4>; +template struct VectorElem0<double4, double4>; +#endif |