/* C doesn't allow +arr. */
if (c_dialect_cxx ())
inform (location, "use unary %<+%> which decays operands to pointers "
- "or %<&%D[0] %s &%D[0]%> to compare the addresses",
- op0, op_symbol_code (code), op1);
+ "or %<&%s%E%s[0] %s &%s%E%s[0]%> to compare the addresses",
+ DECL_P (op0) ? "" : "(", op0, DECL_P (op0) ? "" : ")",
+ op_symbol_code (code),
+ DECL_P (op1) ? "" : "(", op1, DECL_P (op1) ? "" : ")");
else
- inform (location, "use %<&%D[0] %s &%D[0]%> to compare the addresses",
- op0, op_symbol_code (code), op1);
+ inform (location,
+ "use %<&%s%E%s[0] %s &%s%E%s[0]%> to compare the addresses",
+ DECL_P (op0) ? "" : "(", op0, DECL_P (op0) ? "" : ")",
+ op_symbol_code (code),
+ DECL_P (op1) ? "" : "(", op1, DECL_P (op1) ? "" : ")");
}
}
--- /dev/null
+/* PR c/115290 */
+/* { dg-do compile } */
+/* { dg-options "-Warray-compare" } */
+
+int a[32][32], b[32][32];
+
+int
+foo (int x, int y)
+{
+ return (x ? a : b) == (y ? a : b); /* { dg-warning "comparison between two arrays" } */
+/* { dg-message "use '&\\\(\[^\n\r]*\\\)\\\[0\\\] == &\\\(\[^\n\r]*\\\)\\\[0\\\]' to compare the addresses" "" { target c } .-1 } */
+/* { dg-message "use unary '\\\+' which decays operands to pointers or '&\\\(\[^\n\r]*\\\)\\\[0\\\] == &\\\(\[^\n\r]*\\\)\\\[0\\\]' to compare the addresses" "" { target c++ } .-2 } */
+}