diff options
author | Gabor Greif <ggreif@gmail.com> | 2009-03-18 00:55:04 +0000 |
---|---|---|
committer | Gabor Greif <ggreif@gmail.com> | 2009-03-18 00:55:04 +0000 |
commit | 8af7837b08932710072517aa32a7dcbc38e6f358 (patch) | |
tree | d32eb093834d08c17eee2b1ac2af58a6b643f3e8 | |
parent | 110377c669c940680ff9c69f46e3c04293a5cb18 (diff) | |
download | bcm5719-llvm-8af7837b08932710072517aa32a7dcbc38e6f358.tar.gz bcm5719-llvm-8af7837b08932710072517aa32a7dcbc38e6f358.zip |
instantiate ?: expressions
llvm-svn: 67145
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 31 | ||||
-rw-r--r-- | clang/test/SemaTemplate/instantiate-expr-2.cpp | 34 |
2 files changed, 64 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index cdb7f083dfb..a943d4e2a05 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/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/clang/test/SemaTemplate/instantiate-expr-2.cpp b/clang/test/SemaTemplate/instantiate-expr-2.cpp index d90cef5a0b1..82cd757e686 100644 --- a/clang/test/SemaTemplate/instantiate-expr-2.cpp +++ b/clang/test/SemaTemplate/instantiate-expr-2.cpp @@ -65,3 +65,37 @@ void test_unary_op_overload(A<8> *a8) { typedef N4::UnaryOpOverload<N3::Z>::type UZ; UZ *uz = a8; } + +/* +namespace N5 { + template<int I> + struct Lookup { + enum { val = I, more = val + 1 }; + }; + + template<bool B> + struct Cond { + enum Junk { is = B ? Lookup<B>::more : Lookup<Lookup<B+1>::more>::val }; + }; + + enum { resultT = Cond<true>::is, + resultF = Cond<false>::is }; +} +*/ + +namespace N6 { + template<int I> + struct Lookup { + }; + + template<bool B, typename T, typename E> + struct Cond { + typedef Lookup<B ? sizeof(T) : sizeof(E)> True; + typedef Lookup<!B ? sizeof(T) : sizeof(E)> False; + }; + + typedef Cond<true, int, char>::True True; + typedef Cond<false, int, char>::False False; +} + + |