public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-8533] Fix old thinko in warning on pointer for storage order purposes
@ 2021-06-09 10:40 Eric Botcazou
0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2021-06-09 10:40 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:5be418dc591014b1773d59abca8fba5be34df618
commit r11-8533-g5be418dc591014b1773d59abca8fba5be34df618
Author: Eric Botcazou <ebotcazou@adacore.com>
Date: Wed Jun 9 12:37:47 2021 +0200
Fix old thinko in warning on pointer for storage order purposes
gcc/c
PR c/100920
* c-typeck.c (convert_for_assignment): Test fndecl_built_in_p to
spot built-in functions. Do not warn on pointer assignment and
initialization for storage order purposes if the RHS is a call
to a DECL_IS_MALLOC function.
gcc/testsuite/
* gcc.dg/sso-14.c: New test.
Diff:
---
gcc/c/c-typeck.c | 14 ++++++++++-
gcc/testsuite/gcc.dg/sso-14.c | 56 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 51a62c800f7..917e670ddd7 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -7294,23 +7294,35 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type,
&& (AGGREGATE_TYPE_P (ttl) && TYPE_REVERSE_STORAGE_ORDER (ttl))
!= (AGGREGATE_TYPE_P (ttr) && TYPE_REVERSE_STORAGE_ORDER (ttr)))
{
+ tree t;
+
switch (errtype)
{
case ic_argpass:
/* Do not warn for built-in functions, for example memcpy, since we
control how they behave and they can be useful in this area. */
if (TREE_CODE (rname) != FUNCTION_DECL
- || !DECL_IS_UNDECLARED_BUILTIN (rname))
+ || !fndecl_built_in_p (rname))
warning_at (location, OPT_Wscalar_storage_order,
"passing argument %d of %qE from incompatible "
"scalar storage order", parmnum, rname);
break;
case ic_assign:
+ /* Do not warn if the RHS is a call to a function that returns a
+ pointer that is not an alias. */
+ if (TREE_CODE (rhs) != CALL_EXPR
+ || (t = get_callee_fndecl (rhs)) == NULL_TREE
+ || !DECL_IS_MALLOC (t))
warning_at (location, OPT_Wscalar_storage_order,
"assignment to %qT from pointer type %qT with "
"incompatible scalar storage order", type, rhstype);
break;
case ic_init:
+ /* Do not warn if the RHS is a call to a function that returns a
+ pointer that is not an alias. */
+ if (TREE_CODE (rhs) != CALL_EXPR
+ || (t = get_callee_fndecl (rhs)) == NULL_TREE
+ || !DECL_IS_MALLOC (t))
warning_at (location, OPT_Wscalar_storage_order,
"initialization of %qT from pointer type %qT with "
"incompatible scalar storage order", type, rhstype);
diff --git a/gcc/testsuite/gcc.dg/sso-14.c b/gcc/testsuite/gcc.dg/sso-14.c
new file mode 100644
index 00000000000..8941946c3ab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sso-14.c
@@ -0,0 +1,56 @@
+/* PR c/100920 */
+/* Testcase by George Thopas <george.thopas@gmail.com> */
+
+/* { dg-do compile } */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define REV_ENDIANNESS __attribute__((scalar_storage_order("big-endian")))
+#else
+#define REV_ENDIANNESS __attribute__((scalar_storage_order("little-endian")))
+#endif
+
+struct s_1 {
+ int val;
+} REV_ENDIANNESS;
+
+typedef struct s_1 t_1;
+
+struct s_2 {
+ char val;
+} REV_ENDIANNESS;
+
+typedef struct s_2 t_2;
+
+struct s12 {
+ t_1 a[1];
+ t_2 b[1];
+} REV_ENDIANNESS;
+
+typedef struct s12 t_s12;
+
+union u12 {
+ t_1 a[1];
+ t_2 b[1];
+} REV_ENDIANNESS;
+
+typedef union u12 t_u12;
+
+int main(void)
+{
+ t_s12 *msg1 = __builtin_alloca(10);
+ t_u12 *msg2 = __builtin_alloca(10);
+ int same;
+
+ msg1 = malloc (sizeof (t_s12));
+ msg2 = malloc (sizeof (t_u12));
+
+ memset (msg1, 0, sizeof (t_s12));
+ memcpy (msg2, &msg1, sizeof (t_s12));
+ same = memcmp (msg1, msg2, sizeof (t_s12));
+
+ return 0;
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-06-09 10:40 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-09 10:40 [gcc r11-8533] Fix old thinko in warning on pointer for storage order purposes Eric Botcazou
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).