Skip to content

Commit

Permalink
[clang] P2266: apply move elision rules on throw expr nested in funct…
Browse files Browse the repository at this point in the history
…ion 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
  • Loading branch information
mizvekov committed Jun 6, 2022
1 parent 5cac7cd commit 43ef17c
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 5 deletions.
4 changes: 2 additions & 2 deletions clang/lib/Sema/SemaExprCXX.cpp
Expand Up @@ -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;
}
}
Expand Down
6 changes: 3 additions & 3 deletions clang/test/CXX/class/class.init/class.copy.elision/p3.cpp
Expand Up @@ -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 {
Expand Down Expand Up @@ -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){}) {}
Expand Down

0 comments on commit 43ef17c

Please sign in to comment.