[clang] nonblocking/nonallocating attributes (was: nolock/noalloc) (PR #84983)
Doug Wyatt via cfe-commits
cfe-commits at lists.llvm.org
Thu May 16 08:20:10 PDT 2024
================
@@ -7963,6 +7968,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;
+ }
+
+ std::optional<llvm::APSInt> ConditionValue =
+ CondExpr->getIntegerConstantExpr(Context);
+ if (!ConditionValue)
+ return BadExpr();
+ return ConditionValue->getExtValue() ? FunctionEffectMode::True
+ : FunctionEffectMode::False;
+}
+
+static bool
+handleNonBlockingNonAllocatingTypeAttr(TypeProcessingState &TPState,
+ ParsedAttr &PAttr, QualType &QT,
+ FunctionTypeUnwrapper &Unwrapped) {
+ // Delay if this is not a function type.
+ if (!Unwrapped.isFunctionType())
+ return false;
+
+ Sema &S = TPState.getSema();
+
+ // Require FunctionProtoType
+ auto *FPT = Unwrapped.get()->getAs<FunctionProtoType>();
+ if (FPT == nullptr) {
+ S.Diag(PAttr.getLoc(), diag::err_func_with_effects_no_prototype)
+ << PAttr.getAttrName()->getName();
+ return true;
+ }
+
+ // Parse the new attribute.
+ // non/blocking or non/allocating? Or conditional (computed)?
+ const bool IsNonBlocking = PAttr.getKind() == ParsedAttr::AT_NonBlocking ||
----------------
dougsonos wrote:
Not sure I understand the motivation to avoid `const` local variables - to me it reduces complexity for the reader.
https://github.com/llvm/llvm-project/pull/84983
More information about the cfe-commits
mailing list