================ @@ -756,7 +771,68 @@ void etf_fun_params(int lvar EXCLUSIVE_TRYLOCK_FUNCTION(1)); // \ // Check argument parsing. -// legal attribute arguments +int global_int = 0; +int* etf_fun_with_global_ptr_success() EXCLUSIVE_TRYLOCK_FUNCTION(&global_int, &mu1); //\ + // expected-error {{'exclusive_trylock_function' attribute requires parameter 1 to be nullptr or a bool, int, or enum literal}} + +#ifdef CPP11 +constexpr int kTrylockSuccess = 1; +int etf_succ_constexpr() EXCLUSIVE_TRYLOCK_FUNCTION(kTrylockSuccess, mu2); // \ + // expected-error {{'exclusive_trylock_function' attribute requires parameter 1 to be nullptr or a bool, int, or enum literal}} + +int success_value_non_constant = 1; + +bool etf_succ_variable() EXCLUSIVE_TRYLOCK_FUNCTION(success_value_non_constant, mu2); //\ + // expected-error {{attribute requires parameter 1 to be nullptr or a bool, int, or enum literal}} +#endif + + +// Legal permutations of the first argument and function return type. +struct TrylockResult; + +#ifdef CPP11 +int* etf_fun_with_nullptr_success() EXCLUSIVE_TRYLOCK_FUNCTION(nullptr, &mu1); +#endif + +#ifndef __cplusplus +int* etf_fun_with_nullptr_success() EXCLUSIVE_TRYLOCK_FUNCTION(NULL, &mu1); +#endif + +int etf_succ_1_ret_i() EXCLUSIVE_TRYLOCK_FUNCTION(1, mu2); +bool etf_succ_1_ret_b() EXCLUSIVE_TRYLOCK_FUNCTION(1, mu2); +TrylockResult *etf_succ_1_ret_p() EXCLUSIVE_TRYLOCK_FUNCTION(1, mu2); + +int etf_succ_true_ret_i() EXCLUSIVE_TRYLOCK_FUNCTION(true, mu2); +bool etf_succ_true_ret_b() EXCLUSIVE_TRYLOCK_FUNCTION(true, mu2); +TrylockResult *etf_succ_true_ret_p() EXCLUSIVE_TRYLOCK_FUNCTION(true, mu2); + +int etf_succ_false_ret_i() EXCLUSIVE_TRYLOCK_FUNCTION(false, mu2); +bool etf_succ_false_ret_b() EXCLUSIVE_TRYLOCK_FUNCTION(false, mu2); +TrylockResult *etf_succ_false_ret_p() EXCLUSIVE_TRYLOCK_FUNCTION(false, mu2); + +enum TrylockSuccessEnum { TrylockNotAcquired = 0, TrylockAcquired }; +int etf_succ_enum_ret_i() EXCLUSIVE_TRYLOCK_FUNCTION(TrylockAcquired, mu2); +bool etf_succ_enum_ret_b() EXCLUSIVE_TRYLOCK_FUNCTION(TrylockAcquired, mu2); +TrylockResult *etf_succ_enum_ret_p() + EXCLUSIVE_TRYLOCK_FUNCTION(TrylockAcquired, mu2); + +#ifdef CPP11 +enum class TrylockSuccessEnumClass { NotAcquired = 0, Acquired}; +int etf_succ_enum_class_ret_i() + EXCLUSIVE_TRYLOCK_FUNCTION(TrylockSuccessEnumClass::Acquired, mu2); +bool etf_succ_enum_class_ret_b() + EXCLUSIVE_TRYLOCK_FUNCTION(TrylockSuccessEnumClass::Acquired, mu2); +TrylockResult *etf_succ_enum_class_ret_p() + EXCLUSIVE_TRYLOCK_FUNCTION(TrylockSuccessEnumClass::Acquired, mu2); +#endif ---------------- aaronpuchert wrote:
I think `enum class` should not be allowed for now, because we can't convert it to `bool`. Should we add proper support for enumerations, we should probably not convert them to `bool` but rather check for equality. 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