================ @@ -8373,10 +8375,140 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T, IsAddressDiscriminated); IsInvalid |= !S.checkPointerAuthDiscriminatorArg( ExtraDiscriminatorArg, PointerAuthDiscArgKind::Extra, ExtraDiscriminator); + std::string LastAuthenticationMode; + std::optional<PointerAuthenticationMode> AuthenticationMode = std::nullopt; + bool IsIsaPointer = false; + bool AuthenticatesNullValues = false; + + if (AuthenticationOptionsArg && !AuthenticationOptionsArg->containsErrors()) { + StringRef OptionsString; + std::string EvaluatedString; + bool HasEvaluatedOptionsString = false; + const StringLiteral *OptionsStringLiteral = + dyn_cast<StringLiteral>(AuthenticationOptionsArg); + SourceRange AuthenticationOptionsRange = + AuthenticationOptionsArg->getSourceRange(); + bool ReportedEvaluation = false; + auto ReportEvaluationOfExpressionIfNeeded = [&]() { + if (OptionsStringLiteral || !HasEvaluatedOptionsString || + ReportedEvaluation) + return; + ReportedEvaluation = true; + S.Diag(AuthenticationOptionsRange.getBegin(), + diag::note_ptrauth_evaluating_options) + << OptionsString << AuthenticationOptionsRange; + }; + auto DiagnoseInvalidOptionsParameter = [&](llvm::StringRef Reason) { + S.Diag(AuthenticationOptionsRange.getBegin(), + diag::err_ptrauth_invalid_option) + << AttrName << Reason; + Attr.setInvalid(); + IsInvalid = true; + ReportEvaluationOfExpressionIfNeeded(); + }; + if (AuthenticationOptionsArg->isValueDependent() || + AuthenticationOptionsArg->isTypeDependent()) { + DiagnoseInvalidOptionsParameter("is dependent"); + return; + } + if (OptionsStringLiteral) { + OptionsString = OptionsStringLiteral->getString(); + HasEvaluatedOptionsString = true; + } else { + Expr::EvalResult Eval; + bool Result = AuthenticationOptionsArg->EvaluateAsRValue(Eval, Ctx); + if (Result && Eval.Val.isLValue()) { ---------------- ojhunt wrote:
This section can be replaced once https://github.com/llvm/llvm-project/pull/135864 or similar is landed as it supports const char* constant expressions https://github.com/llvm/llvm-project/pull/136828 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits