================ @@ -7517,34 +7517,37 @@ void Sema::checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, } auto *CallerFD = dyn_cast<FunctionDecl>(CurContext); - if (FD && CallerFD && Context.getTargetInfo().hasFeature("sme") && - !FD->getBuiltinID()) { + bool IsCalleeStreaming = ((ExtInfo.AArch64SMEAttributes & + FunctionType::SME_PStateSMEnabledMask) || + (ExtInfo.AArch64SMEAttributes & + FunctionType::SME_PStateSMCompatibleMask)); + bool IsBuiltin = (FD && FD->getBuiltinID()); + + if (CallerFD && Context.getTargetInfo().hasFeature("sme") && !IsBuiltin) { // If the callee has an AArch64 SME __arm_locally_streaming attribute // warn if this function returns VL-based value or pass any such argument, // the streaming and non-streaming vector lengths may be different. - ArmStreamingType CalleeFnType = getArmStreamingFnType(FD); ArmStreamingType CallerFnType = getArmStreamingFnType(CallerFD); // If the caller is a non-streaming function and the callee has a // streaming attribute. If it passed any VL-based arguments or return // VL-based value, then warn that the streaming and non-streaming vector // lengths may be different. if (CallerFnType != ArmStreaming) { - if (CalleeFnType == ArmStreaming) { + if (IsCalleeStreaming) { if (AnyScalableArgs) - Diag(Loc, - diag::warn_sme_non_streaming_caller_pass_args_to_streaming); - if (FD->getReturnType()->isSizelessVectorType()) - Diag(Loc, diag::warn_sme_non_streaming_caller_returns_to_streaming); + Diag(Loc, diag::warn_sme_streaming_pass_return_vl_to_non_streaming); + if (Proto->getReturnType()->isSizelessVectorType()) + Diag(Loc, diag::warn_sme_streaming_pass_return_vl_to_non_streaming); ---------------- dtemirbulatov wrote:
Done. https://github.com/llvm/llvm-project/pull/79842 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits