Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-11 Thread Daniel Dilts via cfe-commits
diltsman updated this revision to Diff 31824.

http://reviews.llvm.org/D10365

Files:
  ../llvm/tools/clang/include/clang/Tooling/JSONCompilationDatabase.h
  ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
  ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp

Index: ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
===
--- ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
+++ ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
@@ -36,8 +36,13 @@
   expectFailure("[{[]:\"\"}]", "Incorrectly typed entry");
   expectFailure("[{}]", "Empty entry");
   expectFailure("[{\"directory\":\"\",\"command\":\"\"}]", "Missing file");
-  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command");
+  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command or arguments");
   expectFailure("[{\"command\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"directory\":\"\",\"arguments\":[]}]", "Missing file");
+  expectFailure("[{\"arguments\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"command\":\"\",\"arguments\":[],\"file\":\"\"}]", "Command and arguments");
+  expectFailure("[{\"directory\":\"\",\"arguments\":\"\",\"file\":\"\"}]", "Arguments not array");
+  expectFailure("[{\"directory\":\"\",\"command\":[],\"file\":\"\"}]", "Command not string");
 }
 
 static std::vector getAllFiles(StringRef JSONDatabase,
Index: ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
===
--- ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
+++ ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
@@ -221,9 +221,8 @@
 SmallString<8> DirectoryStorage;
 SmallString<1024> CommandStorage;
 Commands.emplace_back(
-// FIXME: Escape correctly:
-CommandsRef[I].first->getValue(DirectoryStorage),
-unescapeCommandLine(CommandsRef[I].second->getValue(CommandStorage)));
+  CommandsRef[I].first->getValue(DirectoryStorage),
+  CommandsRef[I].second);
   }
 }
 
@@ -252,35 +251,63 @@
   return false;
 }
 llvm::yaml::ScalarNode *Directory = nullptr;
-llvm::yaml::ScalarNode *Command = nullptr;
+std::vector Args;
+bool CommandFound = false;
 llvm::yaml::ScalarNode *File = nullptr;
 for (llvm::yaml::MappingNode::iterator KVI = Object->begin(),
KVE = Object->end();
  KVI != KVE; ++KVI) {
+  llvm::yaml::ScalarNode *KeyString =
+  dyn_cast((*KVI).getKey());
+  if (!KeyString) {
+ErrorMessage = "Expected strings as key.";
+return false;
+  }
+  SmallString<8> KeyStorage;
+  StringRef KeyValue = KeyString->getValue(KeyStorage);
   llvm::yaml::Node *Value = (*KVI).getValue();
   if (!Value) {
 ErrorMessage = "Expected value.";
 return false;
   }
   llvm::yaml::ScalarNode *ValueString =
   dyn_cast(Value);
-  if (!ValueString) {
-ErrorMessage = "Expected string as value.";
+  llvm::yaml::SequenceNode *SequenceString =
+  dyn_cast(Value);
+  if (KeyValue == "arguments" && !SequenceString) {
+ErrorMessage = "Expected sequence as value.";
 return false;
-  }
-  llvm::yaml::ScalarNode *KeyString =
-  dyn_cast((*KVI).getKey());
-  if (!KeyString) {
-ErrorMessage = "Expected strings as key.";
+  } else if (KeyValue != "arguments" && !ValueString) {
+ErrorMessage = "Expected string as value.";
 return false;
   }
-  SmallString<8> KeyStorage;
-  if (KeyString->getValue(KeyStorage) == "directory") {
+  if (KeyValue == "directory") {
 Directory = ValueString;
-  } else if (KeyString->getValue(KeyStorage) == "command") {
-Command = ValueString;
-  } else if (KeyString->getValue(KeyStorage) == "file") {
+  } else if (KeyValue == "command") {
+if (CommandFound) {
+  ErrorMessage = "Multiple command and arguments found";
+  return false;
+}
+SmallString<1024> CommandStorage;
+// FIXME: Escape correctly:
+Args = unescapeCommandLine(ValueString->getValue(CommandStorage));
+CommandFound = true;
+  } else if (KeyValue == "file") {
 File = ValueString;
+  } else if (KeyValue == "arguments") {
+if (CommandFound) {
+  ErrorMessage = "Multiple command and arguments found";
+  return false;
+}
+for (llvm::yaml::SequenceNode::iterator CI = SequenceString->begin(),
+  CE = SequenceString->end();
+  CI != CE; ++CI) {
+  SmallString<128> CommandStorage;
+  auto ValueString = dyn_cast(&*CI);
+
+  Args.push_back(ValueString->getValue(CommandStorage));
+}
+CommandFound = true;
   } else {

Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-12 Thread Daniel Dilts via cfe-commits
diltsman added inline comments.


Comment at: ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp:299
@@ +298,3 @@
+if (CommandFound) {
+  ErrorMessage = "Multiple command and arguments found";
+  return false;

klimek wrote:
> Any reason we don't want to allow both, but prefer the arguments?
I don't see how the arguments are preferred.

I was thinking that the user would either want to use the command line or list 
arguments.  Is there a case where someone would want to do both?

Also, if we permit both, do we need to do any kind of uniquing?


Comment at: ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp:302-304
@@ +301,5 @@
+}
+for (llvm::yaml::SequenceNode::iterator CI = SequenceString->begin(),
+  CE = SequenceString->end();
+  CI != CE; ++CI) {
+  SmallString<128> CommandStorage;

klimek wrote:
> Can we use for-range loops with auto?
I changed two other locations to range-based for loops, too.


http://reviews.llvm.org/D10365



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-12 Thread Daniel Dilts via cfe-commits
diltsman updated this revision to Diff 31952.
diltsman marked an inline comment as done.

http://reviews.llvm.org/D10365

Files:
  ../llvm/tools/clang/include/clang/Tooling/JSONCompilationDatabase.h
  ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
  ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp

Index: ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
===
--- ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
+++ ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
@@ -36,8 +36,13 @@
   expectFailure("[{[]:\"\"}]", "Incorrectly typed entry");
   expectFailure("[{}]", "Empty entry");
   expectFailure("[{\"directory\":\"\",\"command\":\"\"}]", "Missing file");
-  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command");
+  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command or arguments");
   expectFailure("[{\"command\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"directory\":\"\",\"arguments\":[]}]", "Missing file");
+  expectFailure("[{\"arguments\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"command\":\"\",\"arguments\":[],\"file\":\"\"}]", "Command and arguments");
+  expectFailure("[{\"directory\":\"\",\"arguments\":\"\",\"file\":\"\"}]", "Arguments not array");
+  expectFailure("[{\"directory\":\"\",\"command\":[],\"file\":\"\"}]", "Command not string");
 }
 
 static std::vector getAllFiles(StringRef JSONDatabase,
Index: ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
===
--- ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
+++ ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
@@ -221,9 +221,8 @@
 SmallString<8> DirectoryStorage;
 SmallString<1024> CommandStorage;
 Commands.emplace_back(
-// FIXME: Escape correctly:
-CommandsRef[I].first->getValue(DirectoryStorage),
-unescapeCommandLine(CommandsRef[I].second->getValue(CommandStorage)));
+  CommandsRef[I].first->getValue(DirectoryStorage),
+  CommandsRef[I].second);
   }
 }
 
@@ -243,44 +242,66 @@
 ErrorMessage = "Expected array.";
 return false;
   }
-  for (llvm::yaml::SequenceNode::iterator AI = Array->begin(),
-  AE = Array->end();
-   AI != AE; ++AI) {
-llvm::yaml::MappingNode *Object = dyn_cast(&*AI);
+  for (auto& NextObject : *Array) {
+llvm::yaml::MappingNode *Object = dyn_cast(&NextObject);
 if (!Object) {
   ErrorMessage = "Expected object.";
   return false;
 }
 llvm::yaml::ScalarNode *Directory = nullptr;
-llvm::yaml::ScalarNode *Command = nullptr;
+std::vector Args;
+bool CommandFound = false;
 llvm::yaml::ScalarNode *File = nullptr;
-for (llvm::yaml::MappingNode::iterator KVI = Object->begin(),
-   KVE = Object->end();
- KVI != KVE; ++KVI) {
-  llvm::yaml::Node *Value = (*KVI).getValue();
+for (auto& NextKeyValue : *Object) {
+  llvm::yaml::ScalarNode *KeyString =
+  dyn_cast(NextKeyValue.getKey());
+  if (!KeyString) {
+ErrorMessage = "Expected strings as key.";
+return false;
+  }
+  SmallString<8> KeyStorage;
+  StringRef KeyValue = KeyString->getValue(KeyStorage);
+  llvm::yaml::Node *Value = NextKeyValue.getValue();
   if (!Value) {
 ErrorMessage = "Expected value.";
 return false;
   }
   llvm::yaml::ScalarNode *ValueString =
   dyn_cast(Value);
-  if (!ValueString) {
-ErrorMessage = "Expected string as value.";
+  llvm::yaml::SequenceNode *SequenceString =
+  dyn_cast(Value);
+  if (KeyValue == "arguments" && !SequenceString) {
+ErrorMessage = "Expected sequence as value.";
 return false;
-  }
-  llvm::yaml::ScalarNode *KeyString =
-  dyn_cast((*KVI).getKey());
-  if (!KeyString) {
-ErrorMessage = "Expected strings as key.";
+  } else if (KeyValue != "arguments" && !ValueString) {
+ErrorMessage = "Expected string as value.";
 return false;
   }
-  SmallString<8> KeyStorage;
-  if (KeyString->getValue(KeyStorage) == "directory") {
+  if (KeyValue == "directory") {
 Directory = ValueString;
-  } else if (KeyString->getValue(KeyStorage) == "command") {
-Command = ValueString;
-  } else if (KeyString->getValue(KeyStorage) == "file") {
+  } else if (KeyValue == "command") {
+if (CommandFound) {
+  ErrorMessage = "Multiple command and arguments found";
+  return false;
+}
+SmallString<1024> CommandStorage;
+// FIXME: Escape correctly:
+Args = unescapeCommandLine(ValueString->getValue(CommandStorage));
+CommandFound = true;
+  } else if (KeyValue 

Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-13 Thread Daniel Dilts via cfe-commits
diltsman updated this revision to Diff 32082.
diltsman marked an inline comment as done.
diltsman added a comment.

Arguments and Command can now be in the same compilation database for the same 
file.  Arguments are preferred when both are present.


http://reviews.llvm.org/D10365

Files:
  ../llvm/tools/clang/include/clang/Tooling/JSONCompilationDatabase.h
  ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
  ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp

Index: ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
===
--- ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
+++ ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
@@ -36,8 +36,13 @@
   expectFailure("[{[]:\"\"}]", "Incorrectly typed entry");
   expectFailure("[{}]", "Empty entry");
   expectFailure("[{\"directory\":\"\",\"command\":\"\"}]", "Missing file");
-  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command");
+  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command or arguments");
   expectFailure("[{\"command\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"directory\":\"\",\"arguments\":[]}]", "Missing file");
+  expectFailure("[{\"arguments\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"command\":\"\",\"arguments\":[],\"file\":\"\"}]", "Command and arguments");
+  expectFailure("[{\"directory\":\"\",\"arguments\":\"\",\"file\":\"\"}]", "Arguments not array");
+  expectFailure("[{\"directory\":\"\",\"command\":[],\"file\":\"\"}]", "Command not string");
 }
 
 static std::vector getAllFiles(StringRef JSONDatabase,
Index: ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
===
--- ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
+++ ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
@@ -221,9 +221,8 @@
 SmallString<8> DirectoryStorage;
 SmallString<1024> CommandStorage;
 Commands.emplace_back(
-// FIXME: Escape correctly:
-CommandsRef[I].first->getValue(DirectoryStorage),
-unescapeCommandLine(CommandsRef[I].second->getValue(CommandStorage)));
+  CommandsRef[I].first->getValue(DirectoryStorage),
+  CommandsRef[I].second);
   }
 }
 
@@ -243,43 +242,55 @@
 ErrorMessage = "Expected array.";
 return false;
   }
-  for (llvm::yaml::SequenceNode::iterator AI = Array->begin(),
-  AE = Array->end();
-   AI != AE; ++AI) {
-llvm::yaml::MappingNode *Object = dyn_cast(&*AI);
+  for (auto& NextObject : *Array) {
+llvm::yaml::MappingNode *Object = dyn_cast(&NextObject);
 if (!Object) {
   ErrorMessage = "Expected object.";
   return false;
 }
 llvm::yaml::ScalarNode *Directory = nullptr;
-llvm::yaml::ScalarNode *Command = nullptr;
+std::vector Arguments;
+std::vector Command;
 llvm::yaml::ScalarNode *File = nullptr;
-for (llvm::yaml::MappingNode::iterator KVI = Object->begin(),
-   KVE = Object->end();
- KVI != KVE; ++KVI) {
-  llvm::yaml::Node *Value = (*KVI).getValue();
+for (auto& NextKeyValue : *Object) {
+  llvm::yaml::ScalarNode *KeyString =
+  dyn_cast(NextKeyValue.getKey());
+  if (!KeyString) {
+ErrorMessage = "Expected strings as key.";
+return false;
+  }
+  SmallString<8> KeyStorage;
+  StringRef KeyValue = KeyString->getValue(KeyStorage);
+  llvm::yaml::Node *Value = NextKeyValue.getValue();
   if (!Value) {
 ErrorMessage = "Expected value.";
 return false;
   }
   llvm::yaml::ScalarNode *ValueString =
   dyn_cast(Value);
-  if (!ValueString) {
-ErrorMessage = "Expected string as value.";
+  llvm::yaml::SequenceNode *SequenceString =
+  dyn_cast(Value);
+  if (KeyValue == "arguments" && !SequenceString) {
+ErrorMessage = "Expected sequence as value.";
 return false;
-  }
-  llvm::yaml::ScalarNode *KeyString =
-  dyn_cast((*KVI).getKey());
-  if (!KeyString) {
-ErrorMessage = "Expected strings as key.";
+  } else if (KeyValue != "arguments" && !ValueString) {
+ErrorMessage = "Expected string as value.";
 return false;
   }
-  SmallString<8> KeyStorage;
-  if (KeyString->getValue(KeyStorage) == "directory") {
+  if (KeyValue == "directory") {
 Directory = ValueString;
-  } else if (KeyString->getValue(KeyStorage) == "command") {
-Command = ValueString;
-  } else if (KeyString->getValue(KeyStorage) == "file") {
+  } else if (KeyValue == "arguments") {
+for (auto& NextArgument : *SequenceString) {
+  SmallString<128> CommandStorage;
+  auto ValueString = dyn_cast(&NextArgument);
+
+  Arguments.push_

Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-13 Thread Daniel Dilts via cfe-commits
diltsman added a comment.

Where/how does documentation 
(http://clang.llvm.org/docs/JSONCompilationDatabase.html) get updated?


http://reviews.llvm.org/D10365



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-13 Thread Daniel Dilts via cfe-commits
diltsman updated this revision to Diff 32099.
diltsman marked an inline comment as done.
diltsman added a comment.

Added test for command and arguments in same object.
Fixed bug where parse failed if command and argument resolved to empty lists.


http://reviews.llvm.org/D10365

Files:
  ../llvm/tools/clang/include/clang/Tooling/JSONCompilationDatabase.h
  ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
  ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp

Index: ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
===
--- ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
+++ ../llvm/tools/clang/unittests/Tooling/CompilationDatabaseTest.cpp
@@ -36,8 +36,12 @@
   expectFailure("[{[]:\"\"}]", "Incorrectly typed entry");
   expectFailure("[{}]", "Empty entry");
   expectFailure("[{\"directory\":\"\",\"command\":\"\"}]", "Missing file");
-  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command");
+  expectFailure("[{\"directory\":\"\",\"file\":\"\"}]", "Missing command or arguments");
   expectFailure("[{\"command\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"directory\":\"\",\"arguments\":[]}]", "Missing file");
+  expectFailure("[{\"arguments\":\"\",\"file\":\"\"}]", "Missing directory");
+  expectFailure("[{\"directory\":\"\",\"arguments\":\"\",\"file\":\"\"}]", "Arguments not array");
+  expectFailure("[{\"directory\":\"\",\"command\":[],\"file\":\"\"}]", "Command not string");
 }
 
 static std::vector getAllFiles(StringRef JSONDatabase,
@@ -126,6 +130,25 @@
   return Commands[0];
 }
 
+TEST(JSONCompilationDatabase, ArgumentsPreferredOverCommand) {
+   StringRef Directory("//net/dir");
+   StringRef FileName("//net/dir/filename");
+   StringRef Command("command");
+   StringRef Arguments = "arguments";
+   Twine ArgumentsAccumulate;
+   std::string ErrorMessage;
+   CompileCommand FoundCommand = findCompileArgsInJsonDatabase(
+  FileName,
+  ("[{\"directory\":\"" + Directory + "\","
+ "\"command\":\"" + Command + "\","
+ "\"arguments\":[\"" + Arguments + "\"],"
+ "\"file\":\"" + FileName + "\"}]").str(),
+  ErrorMessage);
+   EXPECT_EQ(Directory, FoundCommand.Directory) << ErrorMessage;
+   EXPECT_EQ(1u, FoundCommand.CommandLine.size()) << ErrorMessage;
+   EXPECT_EQ(Arguments, FoundCommand.CommandLine[0]) << ErrorMessage;
+}
+
 struct FakeComparator : public PathComparator {
   ~FakeComparator() override {}
   bool equivalent(StringRef FileA, StringRef FileB) const override {
Index: ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
===
--- ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
+++ ../llvm/tools/clang/lib/Tooling/JSONCompilationDatabase.cpp
@@ -221,9 +221,8 @@
 SmallString<8> DirectoryStorage;
 SmallString<1024> CommandStorage;
 Commands.emplace_back(
-// FIXME: Escape correctly:
-CommandsRef[I].first->getValue(DirectoryStorage),
-unescapeCommandLine(CommandsRef[I].second->getValue(CommandStorage)));
+  CommandsRef[I].first->getValue(DirectoryStorage),
+  CommandsRef[I].second);
   }
 }
 
@@ -243,43 +242,59 @@
 ErrorMessage = "Expected array.";
 return false;
   }
-  for (llvm::yaml::SequenceNode::iterator AI = Array->begin(),
-  AE = Array->end();
-   AI != AE; ++AI) {
-llvm::yaml::MappingNode *Object = dyn_cast(&*AI);
+  for (auto& NextObject : *Array) {
+llvm::yaml::MappingNode *Object = dyn_cast(&NextObject);
 if (!Object) {
   ErrorMessage = "Expected object.";
   return false;
 }
 llvm::yaml::ScalarNode *Directory = nullptr;
-llvm::yaml::ScalarNode *Command = nullptr;
+std::vector Arguments;
+std::vector Command;
 llvm::yaml::ScalarNode *File = nullptr;
-for (llvm::yaml::MappingNode::iterator KVI = Object->begin(),
-   KVE = Object->end();
- KVI != KVE; ++KVI) {
-  llvm::yaml::Node *Value = (*KVI).getValue();
+bool ArgumentsFound = false;
+bool CommandFound = false;
+for (auto& NextKeyValue : *Object) {
+  llvm::yaml::ScalarNode *KeyString =
+  dyn_cast(NextKeyValue.getKey());
+  if (!KeyString) {
+ErrorMessage = "Expected strings as key.";
+return false;
+  }
+  SmallString<10> KeyStorage;
+  StringRef KeyValue = KeyString->getValue(KeyStorage);
+  llvm::yaml::Node *Value = NextKeyValue.getValue();
   if (!Value) {
 ErrorMessage = "Expected value.";
 return false;
   }
   llvm::yaml::ScalarNode *ValueString =
   dyn_cast(Value);
-  if (!ValueString) {
-ErrorMessage = "Expected string as value.";
+  llvm::yaml::SequenceNode *SequenceString =
+  dyn_cast(Value);
+  if (KeyValue == "arguments" && !Seq

Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-14 Thread Daniel Dilts via cfe-commits
diltsman added a comment.

Yes, please land it.


http://reviews.llvm.org/D10365



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: [PATCH] D10365: Add cmd to compilation database file format

2015-08-10 Thread Daniel Dilts via cfe-commits
diltsman added a subscriber: diltsman.
diltsman added a comment.

I'm trying to upload a new patch and I get an error from Phabricator:
'Unhandled Exception ("Exception")'.

Any ideas how to get this to work?  I have attached the diff file.

- F722854: Arguments.patch 


http://reviews.llvm.org/D10365



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits