[clang] [Clang][Sema] Print more static_assert exprs (PR #74852)

via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 5 06:35:12 PST 2024


================
@@ -6,20 +6,20 @@ struct A {
 };
 
 static_assert(A{1, 2, 3, 4, 5} == A{1, 2, 3, 4, 5});
-static_assert(A{1, 2, 3, 4, 5} == A{0, 2, 3, 4, 5}); // expected-error {{failed}}
-static_assert(A{1, 2, 3, 4, 5} == A{1, 0, 3, 4, 5}); // expected-error {{failed}}
-static_assert(A{1, 2, 3, 4, 5} == A{1, 2, 0, 4, 5}); // expected-error {{failed}}
-static_assert(A{1, 2, 3, 4, 5} == A{1, 2, 3, 0, 5}); // expected-error {{failed}}
-static_assert(A{1, 2, 3, 4, 5} == A{1, 2, 3, 4, 0}); // expected-error {{failed}}
+static_assert(A{1, 2, 3, 4, 5} == A{0, 2, 3, 4, 5}); // expected-error {{failed}} expected-note {{evaluates to}}
----------------
sethp wrote:

I can, though I was worried it'd over-specify advisory output to do so. What do you think about waiting until we reached loose consensus around the format for printing the struct? 

If you're looking for a sample here's a snippet of output from my `build/bin/clang clang/test/CXX/class/class.compare/class.eq/p3.cpp` :

```
clang/test/CXX/class/class.compare/class.eq/p3.cpp:9:15: error: static assertion failed due to requirement 'A{1, 2, 3, 4, 5} == A{0, 2, 3, 4, 5}'
    9 | static_assert(A{1, 2, 3, 4, 5} == A{0, 2, 3, 4, 5}); // expected-error {{failed}} expected-note {{evaluates to}}
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clang/test/CXX/class/class.compare/class.eq/p3.cpp:9:32: note: expression evaluates to '{1, {2, 3, 4}, 5} == {0, {2, 3, 4}, 5}'
    9 | static_assert(A{1, 2, 3, 4, 5} == A{0, 2, 3, 4, 5}); // expected-error {{failed}} expected-note {{evaluates to}}
      |               ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
clang/test/CXX/class/class.compare/class.eq/p3.cpp:10:15: error: static assertion failed due to requirement 'A{1, 2, 3, 4, 5} == A{1, 0, 3, 4, 5}'
   10 | static_assert(A{1, 2, 3, 4, 5} == A{1, 0, 3, 4, 5}); // expected-error {{failed}} expected-note {{evaluates to}}
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clang/test/CXX/class/class.compare/class.eq/p3.cpp:10:32: note: expression evaluates to '{1, {2, 3, 4}, 5} == {1, {0, 3, 4}, 5}'
   10 | static_assert(A{1, 2, 3, 4, 5} == A{1, 0, 3, 4, 5}); // expected-error {{failed}} expected-note {{evaluates to}}
```

That's for:

```c++
struct A {
  int a, b[3], c;
  bool operator==(const A&) const = default;
};
```

Which, to my eye, is a strict improvement over the only alternative (without this patch) that I see to get diagnostics:

```c++
// instead of static_assert(A{1, 2, 3, 4, 5} == A{0, 2, 3, 4, 5});
constexpr A lhs = {1, 2, 3, 4, 5};
constexpr A rhs = {0, 2, 3, 4, 5};
static_assert(lhs.a == rhs.a);
static_assert(lhs.b[0] == rhs.b[0]);
static_assert(lhs.b[1] == rhs.b[1]);
static_assert(lhs.b[2] == rhs.b[2]);
static_assert(lhs.c == rhs.c);
```

https://github.com/llvm/llvm-project/pull/74852


More information about the cfe-commits mailing list