| Index: tools/gn/input_file_manager.cc
|
| diff --git a/tools/gn/input_file_manager.cc b/tools/gn/input_file_manager.cc
|
| index 0b6159c92a507e601800fa472f1db88ae76ad6b9..c9e03f69bed55435e98c9463727e261e79c6d968 100644
|
| --- a/tools/gn/input_file_manager.cc
|
| +++ b/tools/gn/input_file_manager.cc
|
| @@ -215,20 +215,12 @@ const ParseNode* InputFileManager::SyncLoadFile(
|
| }
|
| }
|
|
|
| - // The other load could have failed. In this case that error was probably
|
| - // printed to the console, but we need to return something here, so make up a
|
| - // dummy error.
|
| - //
|
| - // There is a race condition. The other load could have failed, but if the
|
| - // other thread is delayed for some reason, this thread could end up
|
| - // reporting the error to the scheduler first (since first error report
|
| - // wins). The user will see this one and the "real" one will be discarded.
|
| - if (!data->parsed_root) {
|
| - *err = Err(origin, "File parse failed.",
|
| - "If you see this, I'm really sorry, but a race condition has caused\n"
|
| - "me to eat your error message. It was crunchy. If the parse error\n"
|
| - "in your imported file isn't obvious, try re-running GN.");
|
| - }
|
| + // The other load could have failed. It is possible that this thread's error
|
| + // will be reported to the scheduler before the other thread's (and the first
|
| + // error reported "wins"). Forward the parse error from the other load for
|
| + // this thread so that the error message is useful.
|
| + if (!data->parsed_root)
|
| + *err = data->parse_error;
|
| return data->parsed_root.get();
|
| }
|
|
|
| @@ -296,6 +288,8 @@ bool InputFileManager::LoadFile(const LocationRange& origin,
|
| if (success) {
|
| data->tokens.swap(tokens);
|
| data->parsed_root = root.Pass();
|
| + } else {
|
| + data->parse_error = *err;
|
| }
|
|
|
| // Unblock waiters on this event.
|
|
|