forked from OSchip/llvm-project
Eli helped me understand how evaluation contexts work.
llvm-svn: 113642
This commit is contained in:
parent
aee679bf35
commit
e56be2f72c
|
@ -898,6 +898,10 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
|
|||
if (ExpectAndConsume(tok::l_paren,
|
||||
diag::err_expected_lparen_after, "noexcept"))
|
||||
return ExprError();
|
||||
// C++ [expr.unary.noexcept]p1:
|
||||
// The noexcept operator determines whether the evaluation of its operand,
|
||||
// which is an unevaluated operand, can throw an exception.
|
||||
EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
|
||||
ExprResult Result = ParseExpression();
|
||||
SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
|
||||
if (!Result.isInvalid())
|
||||
|
|
|
@ -3116,11 +3116,6 @@ CXXMemberCallExpr *Sema::BuildCXXMemberCallExpr(Expr *Exp,
|
|||
|
||||
ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,
|
||||
SourceLocation RParen) {
|
||||
// C++ [expr.unary.noexcept]p1:
|
||||
// The noexcept operator determines whether the evaluation of its operand,
|
||||
// which is an unevaluated operand, can throw an exception.
|
||||
ExprEvalContexts.back().Context = Unevaluated;
|
||||
|
||||
return Owned(new (Context) CXXNoexceptExpr(Context.BoolTy, Operand,
|
||||
Operand->CanThrow(Context),
|
||||
KeyLoc, RParen));
|
||||
|
|
|
@ -2,14 +2,25 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-pch -o %t-ser.pch -std=c++0x -x c++ %S/ser.h
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -S -emit-llvm -std=c++0x -include-pch %t-ser.pch %s -o - | FileCheck %s
|
||||
|
||||
struct D {
|
||||
~D() throw();
|
||||
};
|
||||
struct E {
|
||||
~E() throw();
|
||||
};
|
||||
|
||||
void test() {
|
||||
bool b;
|
||||
// CHECK: store i8 1, i8* %b, align 1
|
||||
b = noexcept(0);
|
||||
// CHECK: store i8 0, i8* %b, align 1
|
||||
b = noexcept(throw 0);
|
||||
// CHECK: ret i1 true
|
||||
b = f1();
|
||||
// CHECK: ret i1 false
|
||||
b = f2();
|
||||
|
||||
// CHECK-NOT: call void @_ZN1ED1Ev
|
||||
// CHECK: call void @_ZN1DD1Ev
|
||||
D(), noexcept(E());
|
||||
}
|
||||
// CHECK: ret i1 true
|
||||
// CHECK: ret i1 false
|
||||
|
|
Loading…
Reference in New Issue