From: Gabor Greif Date: Wed, 18 Mar 2009 00:55:04 +0000 (+0000) Subject: instantiate ?: expressions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=087edcfb1d6dcb500675cac1636dca2219cb2b75;p=clang instantiate ?: expressions git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67145 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index cdb7f083df..a943d4e2a0 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -615,6 +615,7 @@ namespace { OwningExprResult VisitUnaryOperator(UnaryOperator *E); OwningExprResult VisitBinaryOperator(BinaryOperator *E); OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); + OwningExprResult VisitConditionalOperator(ConditionalOperator *E); OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E); @@ -823,6 +824,34 @@ TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { return move(Result); } +Sema::OwningExprResult +TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) { + Sema::OwningExprResult Cond = Visit(E->getCond()); + if (Cond.isInvalid()) + return SemaRef.ExprError(); + + // FIXME: use getLHS() and cope with NULLness + Sema::OwningExprResult True = Visit(E->getTrueExpr()); + if (True.isInvalid()) + return SemaRef.ExprError(); + + Sema::OwningExprResult False = Visit(E->getFalseExpr()); + if (False.isInvalid()) + return SemaRef.ExprError(); + + Sema::OwningExprResult Result + = SemaRef.ActOnConditionalOp(E->getCond()->getLocEnd(), + E->getFalseExpr()->getLocStart(), + move(Cond), move(True), move(False)); + if (Result.isInvalid()) + return SemaRef.ExprError(); + +/* Cond.release(); + True.release(); + False.release();*/ + return move(Result); +} + Sema::OwningExprResult TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { bool isSizeOf = E->isSizeOf(); @@ -832,7 +861,7 @@ TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { if (T->isDependentType()) { T = SemaRef.InstantiateType(T, TemplateArgs, NumTemplateArgs, /*FIXME*/E->getOperatorLoc(), - &SemaRef.PP.getIdentifierTable().get("sizeof")); + &SemaRef.PP.getIdentifierTable().get("sizeof")); if (T.isNull()) return SemaRef.ExprError(); } diff --git a/test/SemaTemplate/instantiate-expr-2.cpp b/test/SemaTemplate/instantiate-expr-2.cpp index d90cef5a0b..82cd757e68 100644 --- a/test/SemaTemplate/instantiate-expr-2.cpp +++ b/test/SemaTemplate/instantiate-expr-2.cpp @@ -65,3 +65,37 @@ void test_unary_op_overload(A<8> *a8) { typedef N4::UnaryOpOverload::type UZ; UZ *uz = a8; } + +/* +namespace N5 { + template + struct Lookup { + enum { val = I, more = val + 1 }; + }; + + template + struct Cond { + enum Junk { is = B ? Lookup::more : Lookup::more>::val }; + }; + + enum { resultT = Cond::is, + resultF = Cond::is }; +} +*/ + +namespace N6 { + template + struct Lookup { + }; + + template + struct Cond { + typedef Lookup True; + typedef Lookup False; + }; + + typedef Cond::True True; + typedef Cond::False False; +} + +