aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/Expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/AST/Expr.cpp')
-rw-r--r--lib/AST/Expr.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 435f7548ea..65dafae35e 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -1347,6 +1347,11 @@ static Expr::CanThrowResult CanCalleeThrow(const Decl *D,
if (!VD) // If we have no clue what we're calling, assume the worst.
return Expr::CT_Can;
+ // As an extension, we assume that __attribute__((nothrow)) functions don't
+ // throw.
+ if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>())
+ return Expr::CT_Cannot;
+
QualType T = VD->getType();
const FunctionProtoType *FT;
if ((FT = T->getAs<FunctionProtoType>())) {
@@ -1482,7 +1487,7 @@ Expr::CanThrowResult Expr::CanThrow(ASTContext &C) const {
case VAArgExprClass:
case CXXDefaultArgExprClass:
case CXXBindTemporaryExprClass:
- case CXXExprWithTemporariesClass:
+ case CXXExprWithTemporariesClass: // FIXME: this thing calls destructors
case ObjCIvarRefExprClass:
case ObjCIsaExprClass:
case ShuffleVectorExprClass: