[llvm] r276652 - StringSwitch cannot be copied or moved.

Jordan Rose via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 25 10:08:24 PDT 2016


Author: jrose
Date: Mon Jul 25 12:08:24 2016
New Revision: 276652

URL: http://llvm.org/viewvc/llvm-project?rev=276652&view=rev
Log:
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.

Modified:
    llvm/trunk/include/llvm/ADT/StringSwitch.h
    llvm/trunk/lib/Passes/PassBuilder.cpp

Modified: llvm/trunk/include/llvm/ADT/StringSwitch.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringSwitch.h?rev=276652&r1=276651&r2=276652&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/StringSwitch.h (original)
+++ llvm/trunk/include/llvm/ADT/StringSwitch.h Mon Jul 25 12:08:24 2016
@@ -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) {

Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=276652&r1=276651&r2=276652&view=diff
==============================================================================
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Mon Jul 25 12:08:24 2016
@@ -334,13 +334,13 @@ bool PassBuilder::parseModulePassName(Mo
       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);




More information about the llvm-commits mailing list