@@ -39,7 +39,7 @@ class TypeCaseValues {
39
39
if (std::holds_alternative<parser::Default>(guard.u )) {
40
40
typeCases_.emplace_back (stmt, std::nullopt);
41
41
} else if (std::optional<evaluate::DynamicType> type{GetGuardType (guard)}) {
42
- if (PassesChecksOnGuard (guard , *type)) {
42
+ if (PassesChecksOnGuard (stmt , *type)) {
43
43
typeCases_.emplace_back (stmt, *type);
44
44
} else {
45
45
hasErrors_ = true ;
@@ -71,35 +71,46 @@ class TypeCaseValues {
71
71
guard.u );
72
72
}
73
73
74
- bool PassesChecksOnGuard (const parser::TypeGuardStmt::Guard &guard ,
74
+ bool PassesChecksOnGuard (const parser::Statement<parser::TypeGuardStmt> &stmt ,
75
75
const evaluate::DynamicType &guardDynamicType) {
76
+ const parser::TypeGuardStmt &typeGuardStmt{stmt.statement };
77
+ const auto &guard{std::get<parser::TypeGuardStmt::Guard>(typeGuardStmt.t )};
76
78
return std::visit (
77
79
common::visitors{
78
80
[](const parser::Default &) { return true ; },
79
81
[&](const parser::TypeSpec &typeSpec) {
80
- if (const DeclTypeSpec * spec{typeSpec.declTypeSpec }) {
82
+ const DeclTypeSpec *spec{typeSpec.declTypeSpec };
83
+ CHECK (spec);
84
+ CHECK (spec->AsIntrinsic () || spec->AsDerived ());
85
+ bool typeSpecRetVal{false };
86
+ if (spec->AsIntrinsic ()) {
87
+ typeSpecRetVal = true ;
88
+ if (!selectorType_.IsUnlimitedPolymorphic ()) { // C1162
89
+ context_.Say (stmt.source ,
90
+ " If selector is not unlimited polymorphic, "
91
+ " an intrinsic type specification must not be specified "
92
+ " in the type guard statement" _err_en_US);
93
+ typeSpecRetVal = false ;
94
+ }
81
95
if (spec->category () == DeclTypeSpec::Character &&
82
96
!guardDynamicType.IsAssumedLengthCharacter ()) { // C1160
83
97
context_.Say (parser::FindSourceLocation (typeSpec),
84
98
" The type specification statement must have "
85
99
" LEN type parameter as assumed" _err_en_US);
86
- return false ;
100
+ typeSpecRetVal = false ;
87
101
}
88
- if (const DerivedTypeSpec * derived{spec->AsDerived ()}) {
89
- return PassesDerivedTypeChecks (
90
- *derived, parser::FindSourceLocation (typeSpec));
91
- }
92
- return false ;
102
+ } else {
103
+ const DerivedTypeSpec *derived{spec->AsDerived ()};
104
+ typeSpecRetVal = PassesDerivedTypeChecks (
105
+ *derived, parser::FindSourceLocation (typeSpec));
93
106
}
94
- return false ;
107
+ return typeSpecRetVal ;
95
108
},
96
109
[&](const parser::DerivedTypeSpec &x) {
97
- if (const semantics::DerivedTypeSpec *
98
- derived{x.derivedTypeSpec }) {
99
- return PassesDerivedTypeChecks (
100
- *derived, parser::FindSourceLocation (x));
101
- }
102
- return false ;
110
+ CHECK (x.derivedTypeSpec );
111
+ const semantics::DerivedTypeSpec *derived{x.derivedTypeSpec };
112
+ return PassesDerivedTypeChecks (
113
+ *derived, parser::FindSourceLocation (x));
103
114
},
104
115
},
105
116
guard.u );
0 commit comments