================
@@ -395,6 +395,33 @@ bool Sema::checkStringLiteralArgumentAttr(const ParsedAttr 
&AL, unsigned ArgNum,
   return checkStringLiteralArgumentAttr(AL, ArgExpr, Str, ArgLocation);
 }
 
+/// Check if the argument \p ArgNum of \p Attr is a compile-time constant
+/// integer (boolean) expression. If not, emit an error and return false.
+bool Sema::checkBoolExprArgumentAttr(const ParsedAttr &AL, unsigned ArgNum,
+                                     bool &Value) {
+  if (AL.isInvalid()) {
+    return false;
+  }
+  Expr *ArgExpr = AL.getArgAsExpr(ArgNum);
+  SourceLocation ErrorLoc(AL.getLoc());
+
+  if (AL.isArgIdent(ArgNum)) {
+    IdentifierLoc *IL = AL.getArgAsIdent(ArgNum);
+    ErrorLoc = IL->Loc;
+  } else if (ArgExpr != nullptr) {
+    if (const std::optional<llvm::APSInt> MaybeVal =
+            ArgExpr->getIntegerConstantExpr(Context, &ErrorLoc)) {
+      Value = MaybeVal->getBoolValue();
+      return true;
+    }
+  }
----------------
Sirraide wrote:

> how would we represent nolock(expression) before we can evaluate the 
> expression?

You just store the dependent expression in the attribute. If it’s dependent, 
then you only check whether it’s convertible (and whether it’s `true`) when you 
instantiate this attribute by running Sema on it again. As I already mentioned, 
you can take a look at how `CXXAssumeAttr` is handled (I implemented that one 
recently; it has to deal w/ almost all of that as well, so you should be able 
to get an idea as to what you need to do; you can ignore all the custom parsing 
code for it, though), to get an idea as to what you need to do.

> And when would it be collapsed back into a concretely true or false form?

The expression in the attribute itself? Never, pretty much. I’ll just stay as 
an expression, and you can evaluate it to figure out whether it’s `true` or 
`false` (afaik you can wrap the expression in a `ConstantExpr` after evaluating 
it to avoid having to re-evaluate it over and over again).

Feel free to ask if you have any more questions about this; I recall this 
having been quite confusing for me as well when I had to figure out how all of 
this actually works...

https://github.com/llvm/llvm-project/pull/84983
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to