Better error reporting in case of define override

Support empty defines

svn path=/trunk/; revision=30149
This commit is contained in:
Hervé Poussineau 2007-11-05 08:57:04 +00:00
parent cdc0ef2243
commit 69251b5abf
2 changed files with 34 additions and 27 deletions

View file

@ -644,11 +644,8 @@ MingwModuleHandler::GenerateGccDefineParametersFromVector (
parameters += "$(QT)"; parameters += "$(QT)";
parameters += "-D"; parameters += "-D";
parameters += define.name; parameters += define.name;
if (define.value.length () > 0) parameters += "=";
{ parameters += define.value;
parameters += "=";
parameters += define.value;
}
if (define.name.find('(') != string::npos) if (define.name.find('(') != string::npos)
parameters += "$(QT)"; parameters += "$(QT)";
used_defs.insert(used_defs.begin(),define.name); used_defs.insert(used_defs.begin(),define.name);
@ -766,7 +763,7 @@ MingwModuleHandler::GenerateMacro (
const char* assignmentOperation, const char* assignmentOperation,
const string& macro, const string& macro,
const IfableData& data, const IfableData& data,
set<string> *used_defs, set<const Define *> *used_defs,
bool generatingCompilerMacro ) bool generatingCompilerMacro )
{ {
size_t i; size_t i;
@ -814,32 +811,42 @@ MingwModuleHandler::GenerateMacro (
for ( i = 0; i < data.defines.size(); i++ ) for ( i = 0; i < data.defines.size(); i++ )
{ {
const Define& define = *data.defines[i]; const Define& define = *data.defines[i];
if ( used_defs && used_defs->find ( define.name ) != used_defs->end () ) if ( used_defs )
{ {
if ( !define.overridable ) set<const Define *>::const_iterator last_define;
for (last_define = used_defs->begin ();
last_define != used_defs->end ();
last_define++)
{ {
throw InvalidOperationException ( __FILE__, if ( (*last_define)->name != define.name )
__LINE__, continue;
"Invalid override of define '%s' in module '%s'", if ( !define.overridable )
define.name.c_str (), {
module.name.c_str () ); throw InvalidOperationException ( define.node->location.c_str (),
0,
"Invalid override of define '%s', already defined at %s",
define.name.c_str (),
(*last_define)->node->location.c_str () );
}
if ( backend->configuration.Verbose )
printf("%s: Overriding '%s' already defined at %s\n",
(*last_define)->node->location.c_str (), define.name.c_str (),
define.node->location.c_str () );
break;
} }
if ( backend->configuration.Verbose ) if ( last_define != used_defs->end () )
printf("Define '%s' overridden in module '%s'\n", continue;
define.name.c_str (), module.name.c_str () );
continue;
} }
fprintf ( fprintf (
fMakefile, fMakefile,
" -D%s", " -D%s",
define.name.c_str() ); define.name.c_str() );
if ( define.value.size() ) fprintf (
fprintf ( fMakefile,
fMakefile, "=%s",
"=%s", define.value.c_str() );
define.value.c_str() );
if ( used_defs ) if ( used_defs )
used_defs->insert(used_defs->begin(), define.name); used_defs->insert( used_defs->begin (), &define );
} }
if ( generateAssignment ) if ( generateAssignment )
{ {
@ -852,7 +859,7 @@ MingwModuleHandler::GenerateMacros (
const char* assignmentOperation, const char* assignmentOperation,
const IfableData& data, const IfableData& data,
const vector<LinkerFlag*>* linkerFlags, const vector<LinkerFlag*>* linkerFlags,
set<string>& used_defs ) set<const Define *>& used_defs )
{ {
size_t i; size_t i;
@ -2050,7 +2057,7 @@ MingwModuleHandler::GetRpcHeaderDependencies (
void void
MingwModuleHandler::GenerateOtherMacros () MingwModuleHandler::GenerateOtherMacros ()
{ {
set<string> used_defs; set<const Define *> used_defs;
cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ()); cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ());
nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ()); nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ());

View file

@ -137,12 +137,12 @@ private:
void GenerateMacro ( const char* assignmentOperation, void GenerateMacro ( const char* assignmentOperation,
const std::string& macro, const std::string& macro,
const IfableData& data, const IfableData& data,
std::set<std::string>* used_defs, std::set<const Define *>* used_defs,
bool generatingCompilerMacro ); bool generatingCompilerMacro );
void GenerateMacros ( const char* op, void GenerateMacros ( const char* op,
const IfableData& data, const IfableData& data,
const std::vector<LinkerFlag*>* linkerFlags, const std::vector<LinkerFlag*>* linkerFlags,
std::set<std::string>& used_defs ); std::set<const Define *>& used_defs );
void GenerateSourceMacros ( const char* assignmentOperation, void GenerateSourceMacros ( const char* assignmentOperation,
const IfableData& data ); const IfableData& data );
void GenerateObjectMacros ( const char* assignmentOperation, void GenerateObjectMacros ( const char* assignmentOperation,