Index: /home/ggreif/llvm/include/llvm/ADT/StringSwitch.h
===================================================================
--- /home/ggreif/llvm/include/llvm/ADT/StringSwitch.h	(revision 90445)
+++ /home/ggreif/llvm/include/llvm/ADT/StringSwitch.h	(working copy)
@@ -43,23 +43,19 @@
   /// \brief The string we are matching.
   StringRef Str;
 
-  /// \brief The result of this switch statement, once known.
-  T Result;
+  /// \brief The pointer to the result of this switch statement, once known,
+  /// null before that.
+  const T *Result;
 
-  /// \brief Set true when the result of this switch is already known; in this
-  /// case, Result is valid.
-  bool ResultKnown;
-
 public:
   explicit StringSwitch(StringRef Str)
-  : Str(Str), ResultKnown(false) { }
+  : Str(Str), Result(0) { }
 
   template<unsigned N>
   StringSwitch& Case(const char (&S)[N], const T& Value) {
-    if (!ResultKnown && N-1 == Str.size() &&
+    if (!Result && N-1 == Str.size() &&
         (std::memcmp(S, Str.data(), N-1) == 0)) {
-      Result = Value;
-      ResultKnown = true;
+      Result = &Value;
     }
 
     return *this;
@@ -92,16 +88,16 @@
       .Case(S4, Value);
   }
 
-  T Default(const T& Value) {
-    if (ResultKnown)
-      return Result;
+  const T& Default(const T& Value) {
+    if (Result)
+      return *Result;
 
     return Value;
   }
 
   operator T() {
-    assert(ResultKnown && "Fell off the end of a string-switch");
-    return Result;
+    assert(Result && "Fell off the end of a string-switch");
+    return *Result;
   }
 };
 
