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. |