================
@@ -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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to