@ -288,7 +288,7 @@ class CommandLineInterface::ErrorPrinter
public DescriptorPool : : ErrorCollector {
public :
ErrorPrinter ( ErrorFormat format , DiskSourceTree * tree = NULL )
: format_ ( format ) , tree_ ( tree ) , found_errors_ ( false ) { }
: format_ ( format ) , tree_ ( tree ) , found_errors_ ( false ) , found_warnings_ ( false ) { }
~ ErrorPrinter ( ) { }
// implements MultiFileErrorCollector ------------------------------
@ -300,6 +300,7 @@ class CommandLineInterface::ErrorPrinter
void AddWarning ( const std : : string & filename , int line , int column ,
const std : : string & message ) {
found_warnings_ = true ;
AddErrorOrWarning ( filename , line , column , message , " warning " , std : : clog ) ;
}
@ -327,6 +328,8 @@ class CommandLineInterface::ErrorPrinter
bool FoundErrors ( ) const { return found_errors_ ; }
bool FoundWarnings ( ) const { return found_warnings_ ; }
private :
void AddErrorOrWarning ( const std : : string & filename , int line , int column ,
const std : : string & message , const std : : string & type ,
@ -365,6 +368,7 @@ class CommandLineInterface::ErrorPrinter
const ErrorFormat format_ ;
DiskSourceTree * tree_ ;
bool found_errors_ ;
bool found_warnings_ ;
} ;
// -------------------------------------------------------------------
@ -1117,7 +1121,8 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) {
}
}
if ( error_collector - > FoundErrors ( ) ) {
if ( error_collector - > FoundErrors ( ) | |
( fatal_warnings_ & & error_collector - > FoundWarnings ( ) ) ) {
return 1 ;
}
@ -1630,7 +1635,8 @@ bool CommandLineInterface::ParseArgument(const char* arg, std::string* name,
* name = = " --version " | | * name = = " --decode_raw " | |
* name = = " --print_free_field_numbers " | |
* name = = " --experimental_allow_proto3_optional " | |
* name = = " --deterministic_output " ) {
* name = = " --deterministic_output " | |
* name = = " --fatal_warnings " ) {
// HACK: These are the only flags that don't take a value.
// They probably should not be hard-coded like this but for now it's
// not worth doing better.
@ -1883,6 +1889,12 @@ CommandLineInterface::InterpretArgument(const std::string& name,
return PARSE_ARGUMENT_FAIL ;
}
} else if ( name = = " --fatal_warnings " ) {
if ( fatal_warnings_ ) {
std : : cerr < < name < < " may only be passed once. " < < std : : endl ;
return PARSE_ARGUMENT_FAIL ;
}
fatal_warnings_ = true ;
} else if ( name = = " --plugin " ) {
if ( plugin_prefix_ . empty ( ) ) {
std : : cerr < < " This compiler does not support plugins. " < < std : : endl ;