[clang] nonblocking/nonallocating attributes: 2nd pass caller/callee analysis (PR #99656)
Doug Wyatt via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 14 07:53:36 PDT 2024
================
@@ -5137,47 +5137,41 @@ StringRef FunctionEffect::name() const {
llvm_unreachable("unknown effect kind");
}
-bool FunctionEffect::canInferOnFunction(const Decl &Callee) const {
+std::optional<FunctionEffect> FunctionEffect::effectProhibitingInference(
+ const Decl &Callee, const FunctionEffectKindSet &CalleeFX) const {
switch (kind()) {
case Kind::NonAllocating:
case Kind::NonBlocking: {
- FunctionEffectsRef CalleeFX;
- if (auto *FD = Callee.getAsFunction())
- CalleeFX = FD->getFunctionEffects();
- else if (auto *BD = dyn_cast<BlockDecl>(&Callee))
- CalleeFX = BD->getFunctionEffects();
- else
- return false;
- for (const FunctionEffectWithCondition &CalleeEC : CalleeFX) {
+ for (const FunctionEffect &Effect : CalleeFX) {
// nonblocking/nonallocating cannot call allocating.
- if (CalleeEC.Effect.kind() == Kind::Allocating)
- return false;
+ if (Effect.kind() == Kind::Allocating)
+ return Effect;
// nonblocking cannot call blocking.
- if (kind() == Kind::NonBlocking &&
- CalleeEC.Effect.kind() == Kind::Blocking)
- return false;
+ if (kind() == Kind::NonBlocking && Effect.kind() == Kind::Blocking)
+ return Effect;
}
- return true;
+ return std::nullopt;
}
case Kind::Allocating:
case Kind::Blocking:
- return false;
+ assert(0 && "effectProhibitingInference with non-inferable effect kind");
----------------
dougsonos wrote:
Hard experience has trained me to think of `assert()` as a potential no-op, thus the `break`, but yeah, the combination with `llvm_unreachable()` is no good.
https://github.com/llvm/llvm-project/pull/99656
More information about the cfe-commits
mailing list