diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-03-12 22:46:12 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-03-12 22:46:12 +0000 |
commit | 6873f9c5210316d37bc4067e4fdaf26b0bd70b34 (patch) | |
tree | f60c8a19ec200f8f6c4bc5b28c06be5e1f947722 /clang/lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 36ce7e17d7c1cce6b21259b52f6a68d2e6cf4301 (diff) | |
download | bcm5719-llvm-6873f9c5210316d37bc4067e4fdaf26b0bd70b34.tar.gz bcm5719-llvm-6873f9c5210316d37bc4067e4fdaf26b0bd70b34.zip |
Implement template instantiation for builtin binary operators
llvm-svn: 66835
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 6252e29e568..4b98d30b47b 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -576,9 +576,13 @@ namespace { Sema::OwningExprResult VisitIntegerLiteral(IntegerLiteral *E); Sema::OwningExprResult VisitDeclRefExpr(DeclRefExpr *E); Sema::OwningExprResult VisitParenExpr(ParenExpr *E); + Sema::OwningExprResult VisitBinaryOperator(BinaryOperator *E); // Base case. I'm supposed to ignore this. - Sema::OwningExprResult VisitStmt(Stmt *) { return SemaRef.ExprError(); } + Sema::OwningExprResult VisitStmt(Stmt *) { + assert(false && "Cannot instantiate this kind of expression"); + return SemaRef.ExprError(); + } }; } @@ -619,6 +623,29 @@ TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) { } Sema::OwningExprResult +TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) { + Sema::OwningExprResult LHS = Visit(E->getLHS()); + if (LHS.isInvalid()) + return SemaRef.ExprError(); + + Sema::OwningExprResult RHS = Visit(E->getRHS()); + if (RHS.isInvalid()) + return SemaRef.ExprError(); + + Sema::OwningExprResult Result + = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), + E->getOpcode(), + (Expr *)LHS.get(), + (Expr *)RHS.get()); + if (Result.isInvalid()) + return SemaRef.ExprError(); + + LHS.release(); + RHS.release(); + return move(Result); +} + +Sema::OwningExprResult Sema::InstantiateExpr(Expr *E, const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs) { TemplateExprInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs); |