forked from OSchip/llvm-project
PR14838: When a member reference is bound to a temporary, don't forget to
perform the semantic checks associated with the destruction of that temporary. It'll be destroyed at the end of the constructor. llvm-svn: 171818
This commit is contained in:
parent
21444b96c8
commit
27874d603b
|
@ -4290,7 +4290,7 @@ getAssignmentAction(const InitializedEntity &Entity) {
|
|||
llvm_unreachable("Invalid EntityKind!");
|
||||
}
|
||||
|
||||
/// \brief Whether we should binding a created object as a temporary when
|
||||
/// \brief Whether we should bind a created object as a temporary when
|
||||
/// initializing the given entity.
|
||||
static bool shouldBindAsTemporary(const InitializedEntity &Entity) {
|
||||
switch (Entity.getKind()) {
|
||||
|
@ -4320,7 +4320,6 @@ static bool shouldBindAsTemporary(const InitializedEntity &Entity) {
|
|||
/// created for that initialization, requires destruction.
|
||||
static bool shouldDestroyTemporary(const InitializedEntity &Entity) {
|
||||
switch (Entity.getKind()) {
|
||||
case InitializedEntity::EK_Member:
|
||||
case InitializedEntity::EK_Result:
|
||||
case InitializedEntity::EK_New:
|
||||
case InitializedEntity::EK_Base:
|
||||
|
@ -4331,6 +4330,7 @@ static bool shouldDestroyTemporary(const InitializedEntity &Entity) {
|
|||
case InitializedEntity::EK_LambdaCapture:
|
||||
return false;
|
||||
|
||||
case InitializedEntity::EK_Member:
|
||||
case InitializedEntity::EK_Variable:
|
||||
case InitializedEntity::EK_Parameter:
|
||||
case InitializedEntity::EK_Temporary:
|
||||
|
|
|
@ -73,3 +73,19 @@ namespace PR10578 {
|
|||
} catch(...) {
|
||||
}
|
||||
}
|
||||
|
||||
namespace PR14838 {
|
||||
struct base { ~base() {} };
|
||||
class function : base {
|
||||
~function() {} // expected-note {{implicitly declared private here}}
|
||||
public:
|
||||
function(...) {}
|
||||
};
|
||||
struct thing {};
|
||||
struct another {
|
||||
another() : r(thing()) {}
|
||||
// expected-error@-1 {{temporary of type 'const PR14838::function' has private destructor}}
|
||||
// expected-warning@-2 {{binding reference member 'r' to a temporary value}}
|
||||
const function &r; // expected-note {{reference member declared here}}
|
||||
} af;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue