Support: ensure proper state in ErrorOr copy ctors before calling 'get'
Some paths through the copy constructors for 'ErrorOr' were calling 'get' when 'HasError' and 'IsValid' were not properly initialized. Depending on what happened to be in memory for those member variables the asserts in 'get' might incorrectly fire. Fixed by ensuring that the member variables in question are always initialized before calling 'get'. llvm-svn: 174381
This commit is contained in:
parent
7ec43d9b37
commit
2c6cf8e2c7
|
@ -204,18 +204,17 @@ public:
|
|||
// Construct an invalid ErrorOr if other is invalid.
|
||||
if (!Other.IsValid)
|
||||
return;
|
||||
IsValid = true;
|
||||
if (!Other.HasError) {
|
||||
// Get the other value.
|
||||
new (get()) storage_type(*Other.get());
|
||||
HasError = false;
|
||||
new (get()) storage_type(*Other.get());
|
||||
} else {
|
||||
// Get other's error.
|
||||
Error = Other.Error;
|
||||
HasError = true;
|
||||
Error->aquire();
|
||||
}
|
||||
|
||||
IsValid = true;
|
||||
}
|
||||
|
||||
ErrorOr &operator =(const ErrorOr &Other) {
|
||||
|
@ -234,11 +233,11 @@ public:
|
|||
// Construct an invalid ErrorOr if other is invalid.
|
||||
if (!Other.IsValid)
|
||||
return;
|
||||
IsValid = true;
|
||||
if (!Other.HasError) {
|
||||
// Get the other value.
|
||||
IsValid = true;
|
||||
new (get()) storage_type(std::move(*Other.get()));
|
||||
HasError = false;
|
||||
new (get()) storage_type(std::move(*Other.get()));
|
||||
// Tell other not to do any destruction.
|
||||
Other.IsValid = false;
|
||||
} else {
|
||||
|
@ -248,8 +247,6 @@ public:
|
|||
// Tell other not to do any destruction.
|
||||
Other.IsValid = false;
|
||||
}
|
||||
|
||||
IsValid = true;
|
||||
}
|
||||
|
||||
ErrorOr &operator =(ErrorOr &&Other) {
|
||||
|
|
Loading…
Reference in New Issue