[PATCH] D88295: [Sema] Fix volatile check when test if a return object can be implicitly move

Yang Fan via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Sep 26 01:11:22 PDT 2020


nullptr.cpp added a comment.

- C++11:

> [class.copy]p32:
> When **the criteria for elision of a copy operation **are met or would be met save for the fact that the source object is a function parameter, and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue.

//Thus should use rules at://

> [class.copy]p31:
> — in a return statement in a function with a class return type, when the expression is the name of a **non-volatile automatic object **...

**Volatile automatic objects** cannot pass this check.

- CWG1579:

> When **the criteria for elision of a copy operation** are met and the object to be copied is designated by an lvalue, **or when **the expression in a return statement is a (possibly parenthesized) id-expression that names **an object with automatic storage duration **declared in the body or parameter-declaration-clause of the innermost enclosing function or lambda-expression, overload resolution

When the expression is the name of a **volatile automatic object**, the first condition will fail because the criteria for elision of a copy operation require a **non-volatile automatic object **.
So take the  ''**or when ...**'' branch, **volatile automatic objects** can pass this check.

- C++14 is same as CWG1579.

- C++17:

> [class. copy. elision]p(3.1):
> — If the expression in a return statement is a (possibly parenthesized) id-expression that names **an object with automatic storage duration** ...

**Volatile automatic objects** can also pass this check.

- C++20:

> [class. copy. elision]p3:
> An implicitly movable entity is a variable of automatic storage duration that is either **a non-volatile object** or an rvalue reference to a non-volatile object type.
> — If the expression in a return or co_return statement is a (possibly parenthesized) id-expression that names an **implicitly movable entity** ...

**Volatile automatic objects** cannot pass this check.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D88295/new/

https://reviews.llvm.org/D88295



More information about the cfe-commits mailing list