summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaTemplateInstantiate.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-03-12 22:46:12 +0000
committerDouglas Gregor <dgregor@apple.com>2009-03-12 22:46:12 +0000
commit6873f9c5210316d37bc4067e4fdaf26b0bd70b34 (patch)
treef60c8a19ec200f8f6c4bc5b28c06be5e1f947722 /clang/lib/Sema/SemaTemplateInstantiate.cpp
parent36ce7e17d7c1cce6b21259b52f6a68d2e6cf4301 (diff)
downloadbcm5719-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.cpp29
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);
OpenPOWER on IntegriCloud