diff --git a/gcc/gimplify.c b/gcc/gimplify.c index d2ac5f91359..95d55bb8ba4 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1795,7 +1795,13 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p) && !DECL_HAS_VALUE_EXPR_P (decl) && DECL_ALIGN (decl) <= MAX_SUPPORTED_STACK_ALIGNMENT && dbg_cnt (asan_use_after_scope) - && !gimplify_omp_ctxp) + && !gimplify_omp_ctxp + /* GNAT introduces temporaries to hold return values of calls in + initializers of variables defined in other units, so the + declaration of the variable is discarded completely. We do not + want to issue poison calls for such dropped variables. */ + && (DECL_SEEN_IN_BIND_EXPR_P (decl) + || (DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE))) { asan_poisoned_variables->add (decl); asan_poison_variable (decl, false, seq_p); diff --git a/gcc/testsuite/gnat.dg/asan1.adb b/gcc/testsuite/gnat.dg/asan1.adb new file mode 100644 index 00000000000..a4bc59a9a21 --- /dev/null +++ b/gcc/testsuite/gnat.dg/asan1.adb @@ -0,0 +1,15 @@ +-- { dg-do compile } +-- { dg-additional-sources asan1_pkg.ads } +-- { dg-options "-fsanitize=address" } +-- { dg-skip-if "" no_fsanitize_address } + +with Asan1_Pkg; + +procedure Asan1 is + use Asan1_Pkg; + + X, Y : E; +begin + X := C (N); + Y := V; +end Asan1; diff --git a/gcc/testsuite/gnat.dg/asan1_pkg.ads b/gcc/testsuite/gnat.dg/asan1_pkg.ads new file mode 100644 index 00000000000..fbbc1c5e7f5 --- /dev/null +++ b/gcc/testsuite/gnat.dg/asan1_pkg.ads @@ -0,0 +1,9 @@ +package Asan1_Pkg is + subtype E is Integer; + type T is array (1..32) of E; + + function N return T; + function C (P : T) return E; + + V : constant E := C (N); +end Asan1_Pkg;