[flang] SAVE statement should not apply to nested scoping units

SAVE statement, according to 8.6.14, must apply to the same scoping
unit, that excludes nested scoping units. For example, if the SAVE
statement is found in a MODULE, the functions contained in that module
should not inherit the SAVE attribute. I think that the code was doing
this, failing the following source:

```
MODULE pippo
SAVE

CONTAINS
PURE FUNCTION fft_stick_index( )
   IMPLICIT NONE
   INTEGER :: fft_stick_index
   INTEGER :: mc  !error: A pure subprogram may not have a variable with the SAVE attribute
END FUNCTION

END MODULE
```

Differential Revision: https://reviews.llvm.org/D88279
This commit is contained in:
Riccardo Bertossa
2020-09-26 12:41:20 -07:00
committed by Tim Keith
parent 98c5eebcf7
commit c2921d148e
2 changed files with 23 additions and 6 deletions

View File

@@ -1004,12 +1004,8 @@ bool IsSaved(const Symbol &original) {
return true;
} else if (IsDummy(symbol) || IsFunctionResult(symbol)) {
return false;
} else {
for (; !scope->IsGlobal(); scope = &scope->parent()) {
if (scope->hasSAVE()) {
return true;
}
}
} else if (scope->hasSAVE() ) {
return true;
}
}
return false;

View File

@@ -0,0 +1,21 @@
! RUN: %S/test_errors.sh %s %t %f18
MODULE test
SAVE
CONTAINS
PURE FUNCTION pf( )
IMPLICIT NONE
INTEGER :: pf
INTEGER :: mc
!OK: SAVE statement is not inherited by the function
END FUNCTION
PURE FUNCTION pf2( )
IMPLICIT NONE
SAVE
INTEGER :: pf2
!ERROR: A pure subprogram may not have a variable with the SAVE attribute
INTEGER :: mc
END FUNCTION
END MODULE