mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 18:26:37 +00:00
[Clang] Do not emit nodiscard warnings for the base expr of static member access (#131450)
For an expression `nodiscard_function().static_member(), the nodiscard warnings added by #120223, are not useful or actionable, and are disruptive to some library implementations; we just remove them. Fixes #131410
This commit is contained in:
parent
aadfa9f6c8
commit
9a1e39062b
@ -10755,11 +10755,6 @@ public:
|
||||
SourceLocation EndLoc);
|
||||
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl);
|
||||
|
||||
/// DiagnoseDiscardedExprMarkedNodiscard - Given an expression that is
|
||||
/// semantically a discarded-value expression, diagnose if any [[nodiscard]]
|
||||
/// value has been discarded.
|
||||
void DiagnoseDiscardedExprMarkedNodiscard(const Expr *E);
|
||||
|
||||
/// DiagnoseUnusedExprResult - If the statement passed in is an expression
|
||||
/// whose result is unused, warn.
|
||||
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
|
||||
|
@ -1136,7 +1136,6 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
|
||||
if (Converted.isInvalid())
|
||||
return true;
|
||||
BaseExpr = Converted.get();
|
||||
DiagnoseDiscardedExprMarkedNodiscard(BaseExpr);
|
||||
return false;
|
||||
};
|
||||
auto ConvertBaseExprToGLValue = [&] {
|
||||
|
@ -413,10 +413,6 @@ void DiagnoseUnused(Sema &S, const Expr *E, std::optional<unsigned> DiagID) {
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void Sema::DiagnoseDiscardedExprMarkedNodiscard(const Expr *E) {
|
||||
DiagnoseUnused(*this, E, std::nullopt);
|
||||
}
|
||||
|
||||
void Sema::DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID) {
|
||||
if (const LabelStmt *Label = dyn_cast_if_present<LabelStmt>(S))
|
||||
S = Label->getSubStmt();
|
||||
|
@ -164,19 +164,21 @@ struct X {
|
||||
|
||||
[[nodiscard]] X get_X();
|
||||
// cxx11-warning@-1 {{use of the 'nodiscard' attribute is a C++17 extension}}
|
||||
[[nodiscard]] X* get_Ptr();
|
||||
// cxx11-warning@-1 {{use of the 'nodiscard' attribute is a C++17 extension}}
|
||||
void f() {
|
||||
get_X(); // expected-warning{{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
(void) get_X();
|
||||
(void) get_X().variant_member;
|
||||
(void) get_X().anonymous_struct_member;
|
||||
(void) get_X().data_member;
|
||||
(void) get_X().static_data_member;
|
||||
// expected-warning@-1 {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
(void) get_X().unscoped_enum;
|
||||
// expected-warning@-1 {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
(void) get_X().scoped_enum;
|
||||
// expected-warning@-1 {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
(void) get_X().implicit_object_member_function();
|
||||
(void) get_X().static_member_function();
|
||||
// expected-warning@-1 {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
(void) get_Ptr()->implicit_object_member_function();
|
||||
(void) get_Ptr()->static_member_function();
|
||||
#if __cplusplus >= 202302L
|
||||
(void) get_X().explicit_object_member_function();
|
||||
#endif
|
||||
|
@ -2,6 +2,7 @@
|
||||
// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fms-compatibility -emit-pch -o %t -verify %s
|
||||
// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fms-compatibility -include-pch %t %s -ast-print -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 -fdeclspec -fsyntax-only -verify %s -std=c++23
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
#define HEADER
|
||||
@ -103,7 +104,6 @@ struct X {
|
||||
void f() {
|
||||
(void) get_x().imp;
|
||||
(void) get_x().st;
|
||||
// expected-warning@-1 {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
#if __cplusplus >= 202302L
|
||||
(void) get_x().exp;
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user