Commit 65985d78 by Martin Sebor Committed by Martin Sebor

PR c/90737 - [8/9/10 Regression] inconsistent address of a local converted to…

PR c/90737 - [8/9/10 Regression] inconsistent address of a local converted to intptr_t between callee and caller

gcc/c/ChangeLog:

	PR c/90737
	* c-typeck.c (c_finish_return): Only consider functions returning
	pointers as candidates for -Wreturn-local-addr.

gcc/cp/ChangeLog:

	PR c/90737
	* typeck.c (maybe_warn_about_returning_address_of_local): Only
	consider functions returning pointers as candidates for
	-Wreturn-local-addr.

gcc/testsuite/ChangeLog:

	PR c/90737
	* c-c++-common/Wreturn-local-addr.c: New test.
	* g++.dg/warn/Wreturn-local-addr-6.C: New test.

From-SVN: r271985
parent 3146ec83
2019-06-05 Martin Sebor <msebor@redhat.com> 2019-06-05 Martin Sebor <msebor@redhat.com>
PR c/90737
* c-typeck.c (c_finish_return): Only consider functions returning
pointers as candidates for -Wreturn-local-addr.
2019-06-05 Martin Sebor <msebor@redhat.com>
* c-decl.c (start_decl): Adjust quoting and hyphenation * c-decl.c (start_decl): Adjust quoting and hyphenation
in diagnostics. in diagnostics.
(finish_decl): Same. (finish_decl): Same.
......
...@@ -10628,7 +10628,8 @@ c_finish_return (location_t loc, tree retval, tree origtype) ...@@ -10628,7 +10628,8 @@ c_finish_return (location_t loc, tree retval, tree origtype)
if (DECL_P (inner) if (DECL_P (inner)
&& !DECL_EXTERNAL (inner) && !DECL_EXTERNAL (inner)
&& !TREE_STATIC (inner) && !TREE_STATIC (inner)
&& DECL_CONTEXT (inner) == current_function_decl) && DECL_CONTEXT (inner) == current_function_decl
&& POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
{ {
if (TREE_CODE (inner) == LABEL_DECL) if (TREE_CODE (inner) == LABEL_DECL)
warning_at (loc, OPT_Wreturn_local_addr, warning_at (loc, OPT_Wreturn_local_addr,
......
2019-06-05 Martin Sebor <msebor@redhat.com>
PR c/90737
* typeck.c (maybe_warn_about_returning_address_of_local): Only
consider functions returning pointers as candidates for
-Wreturn-local-addr.
2019-06-05 Paolo Carlini <paolo.carlini@oracle.com> 2019-06-05 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (smallest_type_location): New. * decl.c (smallest_type_location): New.
......
...@@ -9307,11 +9307,12 @@ maybe_warn_about_returning_address_of_local (tree retval) ...@@ -9307,11 +9307,12 @@ maybe_warn_about_returning_address_of_local (tree retval)
"returning local %<initializer_list%> variable %qD " "returning local %<initializer_list%> variable %qD "
"does not extend the lifetime of the underlying array", "does not extend the lifetime of the underlying array",
whats_returned); whats_returned);
else if (TREE_CODE (whats_returned) == LABEL_DECL) else if (POINTER_TYPE_P (valtype)
&& TREE_CODE (whats_returned) == LABEL_DECL)
w = warning_at (loc, OPT_Wreturn_local_addr, w = warning_at (loc, OPT_Wreturn_local_addr,
"address of label %qD returned", "address of label %qD returned",
whats_returned); whats_returned);
else else if (POINTER_TYPE_P (valtype))
w = warning_at (loc, OPT_Wreturn_local_addr, w = warning_at (loc, OPT_Wreturn_local_addr,
"address of local variable %qD returned", "address of local variable %qD returned",
whats_returned); whats_returned);
......
2019-06-05 Martin Sebor <msebor@redhat.com>
PR c/90737
* c-c++-common/Wreturn-local-addr.c: New test.
* g++.dg/warn/Wreturn-local-addr-6.C: New test.
2019-06-05 Hongtao Liu <hongtao.liu@intel.com> 2019-06-05 Hongtao Liu <hongtao.liu@intel.com>
* gcc.target/i386/avx512dq-vfpclasspd-1.c: Adjust scan assember * gcc.target/i386/avx512dq-vfpclasspd-1.c: Adjust scan assember
......
/* PR c/90737 - inconsistent address of a local converted to intptr_t
between callee and caller
{ dg-do compile }
{ dg-options "-O1 -Wall -Wreturn-local-addr -fdump-tree-optimized" } */
typedef __INTPTR_TYPE__ intptr_t;
static inline intptr_t
return_addr_local_as_int (void)
{
int i;
if ((intptr_t)&i == 0)
__builtin_abort ();
return (intptr_t)&i;
}
void get_addr_local_as_int (void)
{
intptr_t i = return_addr_local_as_int ();
if (i == 0)
__builtin_abort ();
}
static inline intptr_t
return_addr_label_as_int (void)
{
label:
if ((intptr_t)&&label == 0)
__builtin_abort ();
return (intptr_t)&&label;
}
void get_addr_label_as_int (void)
{
intptr_t i = return_addr_label_as_int ();
if (i == 0)
__builtin_abort ();
}
/* Verify that the functions that return the address of the label
or local variable have been optimized away and so have the calls
to abort.
{ dg-final { scan-tree-dump-not "return_addr_" "optimized" } }
{ dg-final { scan-tree-dump-not "abort" "optimized" } } */
/* PR c/90737 - inconsistent address of a local converted to intptr_t
between callee and caller
{ dg-do compile }
{ dg-options "-O1 -Wall -Wreturn-local-addr -fdump-tree-optimized" } */
typedef __INTPTR_TYPE__ intptr_t;
const intptr_t&
return_addr_label_as_intref (void)
{
label:
if ((const intptr_t*)&&label == 0)
__builtin_exit (1);
return *(const intptr_t*)&&label; // { dg-warning "\\\[-Wreturn-local-addr]" } */
}
const intptr_t&
return_addr_local_as_intref (void)
{
int a[1];
if ((const intptr_t*)a == 0)
__builtin_exit (1);
return (const intptr_t&)a; // { dg-warning "\\\[-Wreturn-local-addr]" } */
}
/* Verify that the return value has been replaced with zero:
{ dg-final { scan-tree-dump-times "return 0;" 2 "optimized" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment