summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2010-09-10 22:34:40 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2010-09-10 22:34:40 +0000
commitb8a76c42b516e55b680ada2af960ecc9613a7c2d (patch)
tree8bf9c7962996260e8e8046fc4ffa3805b13a3b81
parentca3682d4861ac597ea9b03c8b5e0d19bac4df82e (diff)
downloadbcm5719-llvm-b8a76c42b516e55b680ada2af960ecc9613a7c2d.tar.gz
bcm5719-llvm-b8a76c42b516e55b680ada2af960ecc9613a7c2d.zip
Address Doug's comments.
llvm-svn: 113650
-rw-r--r--clang/include/clang/AST/ExprCXX.h3
-rw-r--r--clang/lib/AST/Expr.cpp7
-rw-r--r--clang/lib/Serialization/ASTReaderStmt.cpp6
-rw-r--r--clang/test/CXX/expr/expr.unary/expr.unary.noexcept/cg.cpp4
-rw-r--r--clang/test/CXX/expr/expr.unary/expr.unary.noexcept/sema.cpp2
5 files changed, 13 insertions, 9 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index 4ba0d07e954..1b0a63e32a2 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -2441,9 +2441,6 @@ class CXXNoexceptExpr : public Expr {
SourceRange Range;
friend class ASTStmtReader;
- void setOperand(Expr *E) { Operand = E; }
- void setSourceRange(const SourceRange &R) { Range = R; }
- void setValue(bool V) { Value = V; }
public:
CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 435f7548ea5..65dafae35e4 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/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:
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 0449a989302..c2b054b1f8f 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -1255,9 +1255,9 @@ void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
VisitExpr(E);
- E->setValue((bool)Record[Idx++]);
- E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
- E->setOperand(Reader.ReadSubExpr());
+ E->Value = (bool)Record[Idx++];
+ E->Range = Reader.ReadSourceRange(Record, Idx);
+ E->Operand = Reader.ReadSubExpr();
}
Stmt *ASTReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
diff --git a/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/cg.cpp b/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/cg.cpp
index aa2d553542d..e7a8b1e47f8 100644
--- a/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/cg.cpp
+++ b/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/cg.cpp
@@ -11,9 +11,9 @@ struct E {
void test() {
bool b;
- // CHECK: store i8 1, i8* %b, align 1
+ // CHECK: store i8 1
b = noexcept(0);
- // CHECK: store i8 0, i8* %b, align 1
+ // CHECK: store i8 0
b = noexcept(throw 0);
b = f1();
b = f2();
diff --git a/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/sema.cpp b/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/sema.cpp
index e4d1537cdc1..5182709c89d 100644
--- a/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/sema.cpp
+++ b/clang/test/CXX/expr/expr.unary/expr.unary.noexcept/sema.cpp
@@ -19,12 +19,14 @@ void nospec();
void allspec() throw(...);
void intspec() throw(int);
void emptyspec() throw();
+void nothrowattr() __attribute__((nothrow));
void call() {
N(nospec());
N(allspec());
N(intspec());
P(emptyspec());
+ P(nothrowattr());
}
void (*pnospec)();
OpenPOWER on IntegriCloud