[clang] nonblocking/nonallocating attributes (was: nolock/noalloc) (PR #84983)
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 23 20:22:32 PDT 2024
================
@@ -7518,6 +7523,154 @@ static Attr *getCCTypeAttr(ASTContext &Ctx, ParsedAttr &Attr) {
llvm_unreachable("unexpected attribute kind!");
}
+std::optional<FunctionEffectMode>
+Sema::ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName) {
+ auto BadExpr = [&]() {
+ Diag(CondExpr->getExprLoc(), diag::err_attribute_argument_type)
+ << ("'" + AttributeName.str() + "'") << AANT_ArgumentIntegerConstant
+ << CondExpr->getSourceRange();
+ return std::nullopt;
+ };
+
+ if (CondExpr->isTypeDependent() || CondExpr->isValueDependent()) {
+ if (CondExpr->containsUnexpandedParameterPack())
+ return BadExpr();
+ return FunctionEffectMode::Dependent;
+ }
----------------
Sirraide wrote:
```suggestion
if (DiagnoseUnexpandedParameterPack(CondExpr))
return std::nullopt;
if (CondExpr->isTypeDependent() || CondExpr->isValueDependent())
return FunctionEffectMode::Dependent;
```
I don’t think the way this is set up at the moment actually tells the user that the problem is an unexpanded pack, whereas this should.
(Also, for the record, this function *could* be split into separate `ActOn` and `Build` functions where the former contains only the unexpanded parameter pack check and the latter everything else, and only the latter would then be called in `TreeTransform`, but this is still simple enough to where that probably isn’t necessary and can be left as-is)
https://github.com/llvm/llvm-project/pull/84983
More information about the cfe-commits
mailing list