[flang] Fix copy elision assumption.
authorMichael Kruse <llvm-project@meinersbur.de>
Mon, 14 Dec 2020 17:05:51 +0000 (11:05 -0600)
committerMichael Kruse <llvm-project@meinersbur.de>
Mon, 14 Dec 2020 20:07:05 +0000 (14:07 -0600)
commit2aa43358060c6b34fb9cdc6c4321e958f62331e7
tree7f6abfd4e6feaa1ea320ba7c99f9cf3d1d6b8ead
parent6bc9439f59acbcc5e46a108c2f74a4d5ffe55a3b
[flang] Fix copy elision assumption.

Before this patch, the Restorer depended on copy elision to happen.
Without copy elision, the function ScopedSet calls the move constructor
before its dtor. The dtor will prematurely restore the reference to the
original value.

Instead of relying the compiler to not use the Restorer's copy
constructor, delete its copy and assign operators. Hence, callers cannot
move or copy a Restorer object anymore, and have to explicitly provide
the reset state. ScopedSet avoids calling move/copy operations by
relying on unnamed return value optimization, which is mandatory in
C++17.

Reviewed By: klausler

Differential Revision: https://reviews.llvm.org/D88797
flang/include/flang/Common/restorer.h
flang/lib/Semantics/check-declarations.cpp