[Clang] Warning as error Array Comparisons from C++26 (#118872)
Starting from C++26 the array comparison warning should converted to an error. Fixes: #117859
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// RUN: %check_clang_tidy %s misc-redundant-expression %t -- -- -fno-delayed-template-parsing
|
||||
// RUN: %check_clang_tidy %s misc-redundant-expression %t -- -- -fno-delayed-template-parsing -Wno-array-compare-cxx26
|
||||
|
||||
typedef __INT64_TYPE__ I64;
|
||||
|
||||
|
||||
@@ -428,6 +428,9 @@ New Compiler Flags
|
||||
- The ``-Warray-compare`` warning has been added to warn about array comparison
|
||||
on versions older than C++20.
|
||||
|
||||
- The ``-Warray-compare-cxx26`` warning has been added to warn about array comparison
|
||||
starting from C++26, this warning is enabled as an error by default.
|
||||
|
||||
Deprecated Compiler Flags
|
||||
-------------------------
|
||||
|
||||
|
||||
@@ -10274,6 +10274,11 @@ def warn_array_comparison : Warning<
|
||||
"to compare array addresses, use unary '+' to decay operands to pointers">,
|
||||
InGroup<DiagGroup<"array-compare">>;
|
||||
|
||||
def warn_array_comparison_cxx26 : Warning<
|
||||
"comparison between two arrays is ill-formed in C++26; "
|
||||
"to compare array addresses, use unary '+' to decay operands to pointers">,
|
||||
InGroup<DiagGroup<"array-compare-cxx26">>, DefaultError;
|
||||
|
||||
def warn_stringcompare : Warning<
|
||||
"result of comparison against %select{a string literal|@encode}0 is "
|
||||
"unspecified (use an explicit string comparison function instead)">,
|
||||
|
||||
@@ -11843,7 +11843,9 @@ static void diagnoseTautologicalComparison(Sema &S, SourceLocation Loc,
|
||||
RHSStripped->getType()->isArrayType()) {
|
||||
auto IsDeprArrayComparionIgnored =
|
||||
S.getDiagnostics().isIgnored(diag::warn_depr_array_comparison, Loc);
|
||||
auto DiagID = !S.getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
|
||||
auto DiagID = S.getLangOpts().CPlusPlus26
|
||||
? diag::warn_array_comparison_cxx26
|
||||
: !S.getLangOpts().CPlusPlus20 || IsDeprArrayComparionIgnored
|
||||
? diag::warn_array_comparison
|
||||
: diag::warn_depr_array_comparison;
|
||||
S.Diag(Loc, DiagID) << LHS->getSourceRange() << RHS->getSourceRange()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// RUN: %clang_cc1 -x c -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -x c++ -fsyntax-only -verify=expected,cxx %s
|
||||
// RUN: %clang_cc1 -x c++ -std=c++26 -fsyntax-only -verify=expected,cxx26 %s
|
||||
|
||||
#define DELIM "/"
|
||||
#define DOT "."
|
||||
@@ -15,15 +16,15 @@ void test(const char *d) {
|
||||
if (NULL == "/")
|
||||
return;
|
||||
if ("/" != DELIM) // expected-warning {{result of comparison against a string literal is unspecified (use an explicit string comparison function instead)}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}} cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
if (DELIM == "/") // expected-warning {{result of comparison against a string literal is unspecified (use an explicit string comparison function instead)}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}} cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
if (DELIM != NULL)
|
||||
return;
|
||||
if (NULL == DELIM)
|
||||
return;
|
||||
if (DOT != DELIM) // expected-warning {{result of comparison against a string literal is unspecified (use an explicit string comparison function instead)}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}} cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
if (DELIM == DOT) // expected-warning {{result of comparison against a string literal is unspecified (use an explicit string comparison function instead)}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}}
|
||||
return; // cxx-warning@-1 {{comparison between two arrays}} cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s -verify=expected,not-cxx20
|
||||
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -Wno-deprecated-array-compare -verify %s -verify=expected,not-cxx20
|
||||
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -Wdeprecated -verify %s -verify=expected,cxx20
|
||||
// RUN: %clang_cc1 -std=c++26 -fsyntax-only -Wdeprecated -verify %s -verify=expected,cxx26
|
||||
|
||||
typedef struct {
|
||||
char str[16];
|
||||
@@ -9,13 +10,14 @@ typedef struct {
|
||||
|
||||
bool object_equal(const Object &obj1, const Object &obj2) {
|
||||
if (obj1.str != obj2.str) // not-cxx20-warning {{comparison between two arrays compare their addresses}} cxx20-warning {{comparison between two arrays is deprecated}}
|
||||
return false;
|
||||
return false; // cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
if (obj1.id != obj2.id) // not-cxx20-warning {{comparison between two arrays compare their addresses}} cxx20-warning {{comparison between two arrays is deprecated}}
|
||||
return false;
|
||||
return false; // cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void foo(int (&array1)[2], int (&array2)[2]) {
|
||||
if (array1 == array2) { } // not-cxx20-warning {{comparison between two arrays compare their addresses}} cxx20-warning {{comparison between two arrays is deprecated}}
|
||||
// cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s -verify=expected,not-cxx20
|
||||
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -Wdeprecated -verify %s -verify=expected,cxx20
|
||||
// RUN: %clang_cc1 -std=c++26 -fsyntax-only -Wdeprecated -verify %s -verify=expected,cxx26
|
||||
|
||||
void f(int (&array1)[2], int (&array2)[2]) {
|
||||
if (array1 == array2) { } // not-cxx20-warning {{comparison between two arrays compare their addresses}} cxx20-warning {{comparison between two arrays is deprecated}}
|
||||
// cxx26-error@-1 {{comparison between two arrays is ill-formed in C++26}}
|
||||
}
|
||||
|
||||
@@ -239,7 +239,7 @@ C++23, informally referred to as C++26.</p>
|
||||
<tr>
|
||||
<td>Remove Deprecated Array Comparisons from C++26</td>
|
||||
<td><a href="https://wg21.link/P2865R6">P2865R6</a></td>
|
||||
<td class="none" align="center">No</td>
|
||||
<td class="unreleased" align="center">Clang 20</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Structured Bindings can introduce a Pack</td>
|
||||
|
||||
Reference in New Issue
Block a user