forked from OSchip/llvm-project
[clang] P2266: apply move elision rules on throw expr nested in function prototypes
Our rules to determine if the throw expression are within the variable scope were giving a false negative result in case the throw expression would appear within a decltype in a nested function declaration. Per P2266R3, the relevant rule is: [expr.prim.id.unqual]/2 ``` if the id-expression (possibly parenthesized) is the operand of a throw-expression, and names an implicitly movable entity that belongs to a scope that does not contain the compound-statement of the innermost lambda-expression, try-block , or function-try-block (if any) whose compound-statement or ctor-initializer encloses the throw-expression. ``` This fixes PR54341. Signed-off-by: Matheus Izvekov <mizvekov@gmail.com> Reviewed By: rsmith Differential Revision: https://reviews.llvm.org/D127075
This commit is contained in:
parent
5cac7cda95
commit
43ef17cac1
clang
|
@ -843,10 +843,10 @@ Sema::ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *Ex) {
|
|||
break;
|
||||
}
|
||||
|
||||
// FIXME: Many of the scope checks here seem incorrect.
|
||||
if (S->getFlags() &
|
||||
(Scope::FnScope | Scope::ClassScope | Scope::BlockScope |
|
||||
Scope::FunctionPrototypeScope | Scope::ObjCMethodScope |
|
||||
Scope::TryScope))
|
||||
Scope::ObjCMethodScope | Scope::TryScope))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -98,7 +98,7 @@ struct A1 {
|
|||
A1(const A1 &);
|
||||
A1(A1 &&) = delete;
|
||||
// expected-note@-1 2{{'A1' has been explicitly marked deleted here}}
|
||||
// cxx11_2b-note@-2 {{'A1' has been explicitly marked deleted here}}
|
||||
// cxx11_2b-note@-2 3{{'A1' has been explicitly marked deleted here}}
|
||||
};
|
||||
void test1() {
|
||||
try {
|
||||
|
@ -132,10 +132,10 @@ void test3(A1 a) try {
|
|||
namespace PR54341 {
|
||||
void test4(A1 a) {
|
||||
void f(decltype((throw a, 0)));
|
||||
// expected-warning@-1 {{has no effect}}
|
||||
// expected-error@-1 {{call to deleted constructor of 'test_throw_parameter::A1'}}
|
||||
|
||||
void g(int = decltype(throw a, 0){});
|
||||
// expected-warning@-1 {{has no effect}}
|
||||
// expected-error@-1 {{call to deleted constructor of 'test_throw_parameter::A1'}}
|
||||
}
|
||||
|
||||
void test5(A1 a, int = decltype(throw a, 0){}) {}
|
||||
|
|
Loading…
Reference in New Issue