[ms-inline asm] The parsing of C++ identifiers is a task of the front-end parser,
not the asm parser.  As such, begin moving the parsing logic in that direction.
This patch is just a temporary hack until the real frontend parser can be hooked
up.  Part of rdar://13663589

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179882 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp
index 2190fc4..0ed0fd5 100644
--- a/lib/Sema/SemaStmtAsm.cpp
+++ b/lib/Sema/SemaStmtAsm.cpp
@@ -494,9 +494,40 @@
 
 }
 
+// FIXME: Temporary hack until the frontend parser is hooked up to parse 
+// variables.
+static bool isIdentifierChar(char c) {
+  return isalnum(c) || c == '_' || c == '$' || c == '.' || c == '@';
+}
+
+static void lexIdentifier(const char *&CurPtr) {
+  while (isIdentifierChar(*CurPtr))
+    ++CurPtr;
+}
+
+static StringRef parseIdentifier(StringRef Identifier) {
+  const char *StartPtr = Identifier.data(), *EndPtr, *CurPtr;
+  EndPtr = StartPtr + Identifier.size();
+  CurPtr = StartPtr;
+  while(CurPtr <= EndPtr) {
+    if (isIdentifierChar(*CurPtr))
+      lexIdentifier(CurPtr);
+    else if (CurPtr[0] == ':' && CurPtr[1] == ':')
+      CurPtr += 2;
+    else
+      break;
+  }
+  return StringRef(StartPtr, CurPtr - StartPtr);
+}
+
 NamedDecl *Sema::LookupInlineAsmIdentifier(StringRef Name, SourceLocation Loc,
                                            unsigned &Length, unsigned &Size, 
                                            unsigned &Type, bool &IsVarDecl) {
+  // FIXME: Temporary hack until the frontend parser is hooked up to parse 
+  // variables.
+  StringRef ParsedName = parseIdentifier(Name);
+  assert (ParsedName == Name && "Identifier not parsed correctly!");
+
   Length = 1;
   Size = 0;
   Type = 0;