Genex: Diagnose invalid LINK_ONLY usage instead of crashing
When `$<LINK_ONLY:...>` is used outside of linking we may evaluate it without a `dagChecker`. Do not dereference the NULL pointer and issue a diagnostic instead. Closes: #16287
This commit is contained in:
parent
f6428725bb
commit
f6fd0abc5b
|
@ -672,15 +672,20 @@ static const struct LinkOnlyNode : public cmGeneratorExpressionNode
|
||||||
LinkOnlyNode() {}
|
LinkOnlyNode() {}
|
||||||
|
|
||||||
std::string Evaluate(const std::vector<std::string>& parameters,
|
std::string Evaluate(const std::vector<std::string>& parameters,
|
||||||
cmGeneratorExpressionContext* /*context*/,
|
cmGeneratorExpressionContext* context,
|
||||||
const GeneratorExpressionContent* /*content*/,
|
const GeneratorExpressionContent* content,
|
||||||
cmGeneratorExpressionDAGChecker* dagChecker) const
|
cmGeneratorExpressionDAGChecker* dagChecker) const
|
||||||
CM_OVERRIDE
|
CM_OVERRIDE
|
||||||
{
|
{
|
||||||
|
if (!dagChecker) {
|
||||||
|
reportError(context, content->GetOriginalExpression(),
|
||||||
|
"$<LINK_ONLY:...> may only be used for linking");
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
if (!dagChecker->GetTransitivePropertiesOnly()) {
|
if (!dagChecker->GetTransitivePropertiesOnly()) {
|
||||||
return parameters.front();
|
return parameters.front();
|
||||||
}
|
}
|
||||||
return "";
|
return std::string();
|
||||||
}
|
}
|
||||||
} linkOnlyNode;
|
} linkOnlyNode;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1,8 @@
|
||||||
|
CMake Error at LINK_ONLY-not-linking.cmake:1 \(add_custom_target\):
|
||||||
|
Error evaluating generator expression:
|
||||||
|
|
||||||
|
\$<LINK_ONLY:something>
|
||||||
|
|
||||||
|
\$<LINK_ONLY:...> may only be used for linking
|
||||||
|
Call Stack \(most recent call first\):
|
||||||
|
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1 @@
|
||||||
|
add_custom_target(Custom ALL COMMAND ${CMAKE_COMMAND} -E echo $<LINK_ONLY:something>)
|
|
@ -29,6 +29,7 @@ run_cmake(COMPILE_LANGUAGE-unknown-lang)
|
||||||
run_cmake(TARGET_FILE-recursion)
|
run_cmake(TARGET_FILE-recursion)
|
||||||
run_cmake(OUTPUT_NAME-recursion)
|
run_cmake(OUTPUT_NAME-recursion)
|
||||||
run_cmake(TARGET_PROPERTY-LOCATION)
|
run_cmake(TARGET_PROPERTY-LOCATION)
|
||||||
|
run_cmake(LINK_ONLY-not-linking)
|
||||||
|
|
||||||
run_cmake(ImportedTarget-TARGET_PDB_FILE)
|
run_cmake(ImportedTarget-TARGET_PDB_FILE)
|
||||||
if(LINKER_SUPPORTS_PDB)
|
if(LINKER_SUPPORTS_PDB)
|
||||||
|
|
Loading…
Reference in New Issue