aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/dependency.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2014-08-30 20:47:04 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2014-08-30 20:47:04 +0200
commite284dec53b47987924dfaaec965c2e6c20defe66 (patch)
tree44d1eb25a3e136d70bf49d6948f7f4fe8b473846 /gcc/fortran/dependency.c
parentef719901742ad9ad85130e590c9d40a47794866c (diff)
downloadgcc-e284dec53b47987924dfaaec965c2e6c20defe66.zip
gcc-e284dec53b47987924dfaaec965c2e6c20defe66.tar.gz
gcc-e284dec53b47987924dfaaec965c2e6c20defe66.tar.bz2
re PR fortran/62278 (gfc_check_dependency should also check for TARGET attribute)
2014-08-30 Tobias Burnus <burnus@net-b.de> PR fortran/62278 PR fortran/44735 PR fortran/60593 * dependency.c (gfc_check_dependency): Allow for optimizations in the pointer-alias check. From-SVN: r214757
Diffstat (limited to 'gcc/fortran/dependency.c')
-rw-r--r--gcc/fortran/dependency.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c
index c18482a..367b323 100644
--- a/gcc/fortran/dependency.c
+++ b/gcc/fortran/dependency.c
@@ -1269,6 +1269,7 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical)
/* The interesting cases are when the symbols don't match. */
if (expr1->symtree->n.sym != expr2->symtree->n.sym)
{
+ symbol_attribute attr1, attr2;
gfc_typespec *ts1 = &expr1->symtree->n.sym->ts;
gfc_typespec *ts2 = &expr2->symtree->n.sym->ts;
@@ -1284,9 +1285,13 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical)
return 0;
}
- /* If either variable is a pointer, assume the worst. */
- /* TODO: -fassume-no-pointer-aliasing */
- if (gfc_is_data_pointer (expr1) || gfc_is_data_pointer (expr2))
+ /* We have to also include target-target as ptr%comp is not a
+ pointer but it still alias with "dt%comp" for "ptr => dt". As
+ subcomponents and array access to pointers retains the target
+ attribute, that's sufficient. */
+ attr1 = gfc_expr_attr (expr1);
+ attr2 = gfc_expr_attr (expr2);
+ if ((attr1.pointer || attr1.target) && (attr2.pointer || attr2.target))
{
if (check_data_pointer_types (expr1, expr2)
&& check_data_pointer_types (expr2, expr1))