Index: llvm/trunk/lib/Support/FileCheck.cpp
===================================================================
--- llvm/trunk/lib/Support/FileCheck.cpp
+++ llvm/trunk/lib/Support/FileCheck.cpp
@@ -130,6 +130,11 @@
     return FileCheckErrorDiagnostic::get(
         SM, Name, "string variable with name '" + Name + "' already exists");
 
+  Expr = Expr.ltrim(SpaceChars);
+  if (!Expr.empty())
+    return FileCheckErrorDiagnostic::get(
+        SM, Expr, "unexpected characters after numeric variable name");
+
   return Error::success();
 }
 
@@ -229,27 +234,21 @@
   size_t DefEnd = Expr.find(':');
   if (DefEnd != StringRef::npos) {
     StringRef DefExpr = Expr.substr(0, DefEnd);
-    StringRef UseExpr = Expr = Expr.substr(DefEnd + 1);
+    StringRef UseExpr = Expr.substr(DefEnd + 1);
 
-    DefExpr = DefExpr.ltrim(SpaceChars);
-    StringRef Name;
-    Error ErrorDiagnostic =
-        parseNumericVariableDefinition(DefExpr, Name, Context, SM);
-    if (ErrorDiagnostic)
-      return std::move(ErrorDiagnostic);
-
-    DefinedNumericVariable =
-        Context->makeNumericVariable(this->LineNumber, Name);
-
-    DefExpr = DefExpr.ltrim(SpaceChars);
-    if (!DefExpr.empty())
-      return FileCheckErrorDiagnostic::get(
-          SM, DefExpr, "invalid numeric variable definition");
     UseExpr = UseExpr.ltrim(SpaceChars);
     if (!UseExpr.empty())
       return FileCheckErrorDiagnostic::get(
           SM, UseExpr,
           "unexpected string after variable definition: '" + UseExpr + "'");
+
+    DefExpr = DefExpr.ltrim(SpaceChars);
+    StringRef Name;
+    Error Err = parseNumericVariableDefinition(DefExpr, Name, Context, SM);
+    if (Err)
+      return std::move(Err);
+    DefinedNumericVariable = Context->makeNumericVariable(LineNumber, Name);
+
     return Context->makeExpression(add, nullptr, 0);
   }
 
@@ -1735,32 +1734,12 @@
     if (CmdlineDef[0] == '#') {
       StringRef CmdlineName = CmdlineDef.substr(1, EqIdx - 1);
       StringRef VarName;
-      SMLoc CmdlineNameLoc = SMLoc::getFromPointer(CmdlineName.data());
       Error ErrorDiagnostic = FileCheckPattern::parseNumericVariableDefinition(
           CmdlineName, VarName, this, SM);
       if (ErrorDiagnostic) {
         Errs = joinErrors(std::move(Errs), std::move(ErrorDiagnostic));
         continue;
       }
-      // Check that CmdlineName is only composed of the parsed numeric
-      // variable. This catches cases like "FOO+2" in a "FOO+2=10" definition.
-      if (!CmdlineName.empty()) {
-        Errs = joinErrors(std::move(Errs),
-                          FileCheckErrorDiagnostic::get(
-                              SM, CmdlineNameLoc, "invalid variable name"));
-        continue;
-      }
-
-      // Detect collisions between string and numeric variables when the latter
-      // is created later than the former.
-      if (DefinedVariableTable.find(VarName) != DefinedVariableTable.end()) {
-        Errs = joinErrors(
-            std::move(Errs),
-            FileCheckErrorDiagnostic::get(SM, VarName,
-                                          "string variable with name '" +
-                                              VarName + "' already exists"));
-        continue;
-      }
 
       StringRef CmdlineVal = CmdlineDef.substr(EqIdx + 1);
       uint64_t Val;
Index: llvm/trunk/test/FileCheck/numeric-defines-diagnostics.txt
===================================================================
--- llvm/trunk/test/FileCheck/numeric-defines-diagnostics.txt
+++ llvm/trunk/test/FileCheck/numeric-defines-diagnostics.txt
@@ -20,9 +20,9 @@
 RUN: not FileCheck -D#VALUE+2=10 --input-file %s %s 2>&1 \
 RUN:   | FileCheck %s --strict-whitespace --check-prefix NUMERRCLITRAIL
 
-NUMERRCLITRAIL: Global defines:1:20: error: invalid variable name
+NUMERRCLITRAIL: Global defines:1:25: error: unexpected characters after numeric variable name
 NUMERRCLITRAIL-NEXT: Global define #1: #VALUE+2=10
-NUMERRCLITRAIL-NEXT: {{^                   \^$}}
+NUMERRCLITRAIL-NEXT: {{^                        \^$}}
 
 ; Invalid value: numeric expression instead of literal.
 RUN: not FileCheck -D#VALUE1=3 -D#VALUE2='VALUE1 + 2' --input-file %s %s 2>&1 \