summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2016-07-25 17:08:24 +0000
committerJordan Rose <jordan_rose@apple.com>2016-07-25 17:08:24 +0000
commit0cdbe7a57235dd76f8fcb8a8d990a078b025ca27 (patch)
tree16d4560af44027bfac78024c9f4dd2c3b0d5847e
parentdf4b4a8fabd8d810d010e40e6ac3bedc824e01a4 (diff)
downloadbcm5719-llvm-0cdbe7a57235dd76f8fcb8a8d990a078b025ca27.tar.gz
bcm5719-llvm-0cdbe7a57235dd76f8fcb8a8d990a078b025ca27.zip
StringSwitch cannot be copied or moved.
...but most importantly, it cannot be used well with 'auto', because the inferred type is StringSwitch rather than the result type. This is a problem because StringSwitch stores addresses of temporary values rather than copying or moving the value into its own storage. Changing this uncovered the bug in PassBuilder, also in this patch. Clang doesn't seem to have any occurrences of the issue. llvm-svn: 276652
-rw-r--r--llvm/include/llvm/ADT/StringSwitch.h7
-rw-r--r--llvm/lib/Passes/PassBuilder.cpp14
2 files changed, 14 insertions, 7 deletions
diff --git a/llvm/include/llvm/ADT/StringSwitch.h b/llvm/include/llvm/ADT/StringSwitch.h
index 42b0fc4bc44..dc3b15b8111 100644
--- a/llvm/include/llvm/ADT/StringSwitch.h
+++ b/llvm/include/llvm/ADT/StringSwitch.h
@@ -53,6 +53,13 @@ public:
explicit StringSwitch(StringRef S)
: Str(S), Result(nullptr) { }
+ // StringSwitch is neither copyable nor movable.
+ StringSwitch(const StringSwitch &) = delete;
+ StringSwitch(StringSwitch &&) = delete;
+ void operator=(const StringSwitch &) = delete;
+ void operator=(StringSwitch &&) = delete;
+ ~StringSwitch() = default;
+
template<unsigned N>
LLVM_ATTRIBUTE_ALWAYS_INLINE
StringSwitch& Case(const char (&S)[N], const T& Value) {
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 6c0ceb0a3d6..594fe814c83 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -334,13 +334,13 @@ bool PassBuilder::parseModulePassName(ModulePassManager &MPM, StringRef Name,
return false;
assert(Matches.size() == 3 && "Must capture two matched strings!");
- auto L = StringSwitch<OptimizationLevel>(Matches[2])
- .Case("O0", O0)
- .Case("O1", O1)
- .Case("O2", O2)
- .Case("O3", O3)
- .Case("Os", Os)
- .Case("Oz", Oz);
+ OptimizationLevel L = StringSwitch<OptimizationLevel>(Matches[2])
+ .Case("O0", O0)
+ .Case("O1", O1)
+ .Case("O2", O2)
+ .Case("O3", O3)
+ .Case("Os", Os)
+ .Case("Oz", Oz);
if (Matches[1] == "default") {
addPerModuleDefaultPipeline(MPM, L, DebugLogging);
OpenPOWER on IntegriCloud