================
@@ -614,9 +619,23 @@ static bool checkTryLockFunAttrCommon(Sema &S, Decl *D, 
const ParsedAttr &AL,
     return false;
   }
 
-  // check that all arguments are lockable objects
+  // Check that all remaining arguments are lockable objects.
   checkAttrArgsAreCapabilityObjs(S, D, AL, Args, 1);
 
+  // Check that the attribute is applied to a function.
+  if (!D->isFunctionOrFunctionTemplate()) {
+    return false;
+  }
+  // Check that the function returns a boolean, integer, or pointer.
+  QualType ReturnType = D->getAsFunction()->getReturnType();
+  if (!ReturnType->isBooleanType() && !ReturnType->isIntegerType() &&
+      !ReturnType->isPointerType()) {
+    S.Diag(AL.getLoc(), diag::err_attribute_wrong_decl_type)
+        << AL << AL.isRegularKeywordAttribute()
+        << ExpectedFunctionReturningBoolIntegerOrPointer;
+    return false;
+  }
+
   return true;
 }
----------------
AaronBallman wrote:

Should we flip the logic here so we're looking for:
```
if (ReturnType->isBooleanType() || ReturnType->isIntegerType()...)
  return true;

return !S.Diag(...);
```

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

Reply via email to