================ @@ -8340,8 +8340,17 @@ void Sema::checkInitializerLifetime(const InitializedEntity &Entity, << Entity.getType()->isReferenceType() << CLE->getInitializer() << 2 << DiagRange; } else { - Diag(DiagLoc, diag::warn_ret_local_temp_addr_ref) - << Entity.getType()->isReferenceType() << DiagRange; + // P2748R5: Disallow Binding a Returned Glvalue to a Temporary. + // [stmt.return]/p6: In a function whose return type is a reference, + // other than an invented function for std::is_convertible ([meta.rel]), + // a return statement that binds the returned reference to a temporary + // expression ([class.temporary]) is ill-formed. + if (getLangOpts().CPlusPlus26) + Diag(DiagLoc, diag::err_ret_local_temp_addr_ref) + << Entity.getType()->isReferenceType() << DiagRange; ---------------- t3nsor wrote:
It's not normatively ill-formed because of the difficulty of specifying exactly which constructs of this nature are supposed to be ill-formed. In the pedantic mode or whatever it's called, you'd have to accept it, even though it's bad. https://github.com/llvm/llvm-project/pull/89942 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits