]> granicus.if.org Git - clang/commitdiff
Template instantiation for C++ throw expressions
authorDouglas Gregor <dgregor@apple.com>
Thu, 21 May 2009 17:37:52 +0000 (17:37 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 21 May 2009 17:37:52 +0000 (17:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72217 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ExprCXX.h
lib/Sema/SemaTemplateInstantiateExpr.cpp
test/SemaTemplate/instantiate-expr-4.cpp

index df01e9bef4d94dd3acf91c0beb4e7d9e5a0fa060..d02c6042f2f68c4182dcc990278cba8d5944d6a1 100644 (file)
@@ -351,6 +351,10 @@ public:
     Expr(CXXThrowExprClass, Ty, false, false), Op(expr), ThrowLoc(l) {}
   const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); }
   Expr *getSubExpr() { return cast_or_null<Expr>(Op); }
+  void setSubExpr(Expr *E) { Op = E; }
+
+  SourceLocation getThrowLoc() const { return ThrowLoc; }
+  void setThrowLoc(SourceLocation L) { ThrowLoc = L; }
 
   virtual SourceRange getSourceRange() const {
     if (getSubExpr() == 0)
index b9671c2c17694d3cd51fa39194c62ca1b12e8784..55be2c2c8fec7fea32775478c789d9865c3d0077 100644 (file)
@@ -83,7 +83,7 @@ namespace {
     OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
     OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
     // FIXME: CXXTypeIdExpr
-    // FIXME: CXXThrowExpr
+    OwningExprResult VisitCXXThrowExpr(CXXThrowExpr *E);
     // FIXME: CXXDefaultArgExpr
     OwningExprResult VisitCXXConstructExpr(CXXConstructExpr *E);
     OwningExprResult VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
@@ -812,6 +812,18 @@ TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
   return SemaRef.Owned(TE);
 }
 
+Sema::OwningExprResult 
+TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
+  OwningExprResult SubExpr(SemaRef, (void *)0);
+  if (E->getSubExpr()) {
+    SubExpr = Visit(E->getSubExpr());
+    if (SubExpr.isInvalid())
+      return SemaRef.ExprError();
+  }
+
+  return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
+}
+
 Sema::OwningExprResult 
 TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
   assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
index 2fd9f045693b346adc4f09e250115c3085cd379e..6ef0f83add7241da60d59456812868b2f5d1f0f0 100644 (file)
@@ -95,3 +95,21 @@ struct Delete0 {
 template struct Delete0<int*>;
 template struct Delete0<X*>;
 template struct Delete0<int>; // expected-note{{instantiation}}
+
+// ---------------------------------------------------------------------
+// throw expressions
+// ---------------------------------------------------------------------
+template<typename T>
+struct Throw1 {
+  void f(T t) {
+    throw;
+    throw t; // expected-error{{incomplete type}}
+  }
+};
+
+struct Incomplete; // expected-note{{forward}}
+
+template struct Throw1<int>;
+template struct Throw1<int*>;
+template struct Throw1<Incomplete*>; // expected-note{{instantiation}}
+