diff options
author | Gregor Jasny <gjasny@googlemail.com> | 2014-11-18 15:34:32 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2014-11-25 19:14:20 (GMT) |
commit | d54617d0068fc5acfa2079d1e8de8f38365564ab (patch) | |
tree | aa52361e45033aa8ca16d7d95a58535a3118c5c9 /Source/cmBreakCommand.cxx | |
parent | bae604d9a80d5d97c676c85848e37783a153ff19 (diff) | |
download | CMake-d54617d0068fc5acfa2079d1e8de8f38365564ab.zip CMake-d54617d0068fc5acfa2079d1e8de8f38365564ab.tar.gz CMake-d54617d0068fc5acfa2079d1e8de8f38365564ab.tar.bz2 |
break: Add policy CMP0055 to check calls strictly
Reject break() without loop scope or any arguments.
Signed-off-by: Gregor Jasny <gjasny@googlemail.com>
Diffstat (limited to 'Source/cmBreakCommand.cxx')
-rw-r--r-- | Source/cmBreakCommand.cxx | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/Source/cmBreakCommand.cxx b/Source/cmBreakCommand.cxx index b70e400..ff527db 100644 --- a/Source/cmBreakCommand.cxx +++ b/Source/cmBreakCommand.cxx @@ -12,10 +12,76 @@ #include "cmBreakCommand.h" // cmBreakCommand -bool cmBreakCommand::InitialPass(std::vector<std::string> const&, +bool cmBreakCommand::InitialPass(std::vector<std::string> const &args, cmExecutionStatus &status) { + if(!this->Makefile->IsLoopBlock()) + { + bool issueMessage = true; + cmOStringStream e; + cmake::MessageType messageType = cmake::AUTHOR_WARNING; + switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0055)) + { + case cmPolicies::WARN: + e << (this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0055)) << "\n"; + break; + case cmPolicies::OLD: + issueMessage = false; + break; + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::NEW: + messageType = cmake::FATAL_ERROR; + break; + } + + if(issueMessage) + { + e << "A BREAK command was found outside of a proper " + "FOREACH or WHILE loop scope."; + this->Makefile->IssueMessage(messageType, e.str()); + if(messageType == cmake::FATAL_ERROR) + { + return false; + } + } + } + status.SetBreakInvoked(true); + + if(!args.empty()) + { + bool issueMessage = true; + cmOStringStream e; + cmake::MessageType messageType = cmake::AUTHOR_WARNING; + switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0055)) + { + case cmPolicies::WARN: + e << (this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0055)) << "\n"; + break; + case cmPolicies::OLD: + issueMessage = false; + break; + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::NEW: + messageType = cmake::FATAL_ERROR; + break; + } + + if(issueMessage) + { + e << "The BREAK command does not accept any arguments."; + this->Makefile->IssueMessage(messageType, e.str()); + if(messageType == cmake::FATAL_ERROR) + { + return false; + } + } + } + return true; } |