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.

llvm-svn: 72145
This commit is contained in:
Douglas Gregor 2009-05-19 23:29:16 +00:00
parent ad3150cd38
commit 68f1096212
2 changed files with 44 additions and 3 deletions

View File

@ -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()));

View File

@ -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