summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMeador Inge <meadori@codesourcery.com>2013-02-05 15:41:27 +0000
committerMeador Inge <meadori@codesourcery.com>2013-02-05 15:41:27 +0000
commit2ebc580638548744dfbd7637d56156e2dcf7ea2c (patch)
tree10df6a1f1983b17f531d89e251575d6c7b38abec /include
parentf5b39cd8dec1e64ce060bf5bcafc13aaf72d9d70 (diff)
downloadllvm-2ebc580638548744dfbd7637d56156e2dcf7ea2c.tar.gz
llvm-2ebc580638548744dfbd7637d56156e2dcf7ea2c.tar.bz2
llvm-2ebc580638548744dfbd7637d56156e2dcf7ea2c.tar.xz
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'. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174381 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Support/ErrorOr.h11
1 files changed, 4 insertions, 7 deletions
diff --git a/include/llvm/Support/ErrorOr.h b/include/llvm/Support/ErrorOr.h
index 653b9e5c88..c22c3ca84f 100644
--- a/include/llvm/Support/ErrorOr.h
+++ b/include/llvm/Support/ErrorOr.h
@@ -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) {