BUG: Enforce matching policy PUSH/POP in all files

The documentation of cmake_policy PUSH and POP states that they must
always match.  Previously we enforced this only for the top scope of
each CMakeLists.txt file.  This enforces the requirement for all files.
This commit is contained in:
Brad King 2009-01-15 14:37:14 -05:00
parent 40366f6ced
commit d602a3db85
2 changed files with 19 additions and 14 deletions

View File

@ -562,6 +562,11 @@ bool cmMakefile::ReadListFile(const char* filename_in,
// add this list file to the list of dependencies // add this list file to the list of dependencies
this->ListFiles.push_back( filenametoread); this->ListFiles.push_back( filenametoread);
bool endScopeNicely = true; bool endScopeNicely = true;
// Save the current policy stack depth.
size_t const policy_depth = this->PolicyStack.size();
// Run the parsed commands.
const size_t numberFunctions = cacheFile.Functions.size(); const size_t numberFunctions = cacheFile.Functions.size();
for(size_t i =0; i < numberFunctions; ++i) for(size_t i =0; i < numberFunctions; ++i)
{ {
@ -576,6 +581,17 @@ bool cmMakefile::ReadListFile(const char* filename_in,
} }
} }
// Restore policy stack depth.
while(this->PolicyStack.size() > policy_depth)
{
if(endScopeNicely)
{
this->IssueMessage(cmake::FATAL_ERROR,
"cmake_policy PUSH without matching POP");
}
this->PopPolicy(false);
}
// send scope ended to and function blockers // send scope ended to and function blockers
if (endScopeNicely) if (endScopeNicely)
{ {
@ -597,7 +613,7 @@ bool cmMakefile::ReadListFile(const char* filename_in,
// some extra checks. // some extra checks.
if(this->ListFileStack.size() == 1) if(this->ListFileStack.size() == 1)
{ {
this->EnforceDirectoryLevelRules(endScopeNicely); this->EnforceDirectoryLevelRules();
} }
this->AddDefinition("CMAKE_PARENT_LIST_FILE", currentParentFile.c_str()); this->AddDefinition("CMAKE_PARENT_LIST_FILE", currentParentFile.c_str());
@ -610,19 +626,8 @@ bool cmMakefile::ReadListFile(const char* filename_in,
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmMakefile::EnforceDirectoryLevelRules(bool endScopeNicely) void cmMakefile::EnforceDirectoryLevelRules()
{ {
// Enforce policy stack depth.
while(this->PolicyStack.size() > 1)
{
if(endScopeNicely)
{
this->IssueMessage(cmake::FATAL_ERROR,
"cmake_policy PUSH without matching POP");
}
this->PopPolicy(false);
}
// Diagnose a violation of CMP0000 if necessary. // Diagnose a violation of CMP0000 if necessary.
if(this->CheckCMP0000) if(this->CheckCMP0000)
{ {

View File

@ -918,7 +918,7 @@ private:
bool CheckCMP0000; bool CheckCMP0000;
// Enforce rules about CMakeLists.txt files. // Enforce rules about CMakeLists.txt files.
void EnforceDirectoryLevelRules(bool endScopeNicely); void EnforceDirectoryLevelRules();
}; };