================ @@ -10818,11 +10819,39 @@ static bool IsImplicitBoolFloatConversion(Sema &S, Expr *Ex, bool ToBool) { FloatCandidateBT && (FloatCandidateBT->isFloatingPoint())); } +/// Check to see if the wraps or no_wraps attribute may have been lost through +/// a function call. For cases where we are unsure, assume not. +static bool IsWrapsAttrLost(Sema &S, const CallExpr *TheCall, + const FunctionDecl *FD, unsigned i) { + // We may not have a FunctionDecl if this CallExpr is associated virtual, + // templated or overloaded functions. + if (!FD) + return false; + + if (i >= TheCall->getNumArgs() || i >= FD->getNumParams()) + return false; + + const QualType ProvidedArgTy = TheCall->getArg(i)->getType(); + const QualType PrototypedArgTy = FD->getParamDecl(i)->getType(); + + return (ProvidedArgTy.hasWrapsAttr() && !PrototypedArgTy.hasWrapsAttr()) || + (ProvidedArgTy.hasNoWrapsAttr() && !PrototypedArgTy.hasNoWrapsAttr()); +} + static void CheckImplicitArgumentConversions(Sema &S, CallExpr *TheCall, SourceLocation CC) { unsigned NumArgs = TheCall->getNumArgs(); + const FunctionDecl *FD = TheCall->getDirectCallee(); + for (unsigned i = 0; i < NumArgs; ++i) { Expr *CurrA = TheCall->getArg(i); + + if (IsWrapsAttrLost(S, TheCall, FD, i)) ---------------- erichkeane wrote:
This is looking an AWFUL lot like this needing to be a type with a defined conversion. I don't think `AttributedType` is sufficient here, this should also probably be a diagnosed-error, which you get when it is a part of the actual type. https://github.com/llvm/llvm-project/pull/115094 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits