@@ -280,6 +280,7 @@ class AccAttributeVisitor : DirectiveAttributeVisitor<llvm::acc::Directive> {
280
280
const parser::Name &, const Symbol &, Symbol::Flag);
281
281
void AllowOnlyArrayAndSubArray (const parser::AccObjectList &objectList);
282
282
void DoNotAllowAssumedSizedArray (const parser::AccObjectList &objectList);
283
+ void AllowOnlyVariable (const parser::AccObject &object);
283
284
void EnsureAllocatableOrPointer (
284
285
const llvm::acc::Clause clause, const parser::AccObjectList &objectList);
285
286
void AddRoutineInfoToSymbol (
@@ -1117,6 +1118,25 @@ void AccAttributeVisitor::DoNotAllowAssumedSizedArray(
1117
1118
}
1118
1119
}
1119
1120
1121
+ void AccAttributeVisitor::AllowOnlyVariable (const parser::AccObject &object) {
1122
+ common::visit (
1123
+ common::visitors{
1124
+ [&](const parser::Designator &designator) {
1125
+ const auto &name{GetLastName (designator)};
1126
+ if (name.symbol && !semantics::IsVariableName (*name.symbol )) {
1127
+ context_.Say (designator.source ,
1128
+ " Only variables are allowed in data clauses on the %s "
1129
+ " directive" _err_en_US,
1130
+ parser::ToUpperCaseLetters (
1131
+ llvm::acc::getOpenACCDirectiveName (GetContext ().directive )
1132
+ .str ()));
1133
+ }
1134
+ },
1135
+ [&](const auto &name) {},
1136
+ },
1137
+ object.u );
1138
+ }
1139
+
1120
1140
bool AccAttributeVisitor::Pre (const parser::OpenACCCacheConstruct &x) {
1121
1141
const auto &verbatim{std::get<parser::Verbatim>(x.t )};
1122
1142
PushContext (verbatim.source , llvm::acc::Directive::ACCD_cache);
@@ -1281,6 +1301,7 @@ Symbol *AccAttributeVisitor::ResolveAccCommonBlockName(
1281
1301
void AccAttributeVisitor::ResolveAccObjectList (
1282
1302
const parser::AccObjectList &accObjectList, Symbol::Flag accFlag) {
1283
1303
for (const auto &accObject : accObjectList.v ) {
1304
+ AllowOnlyVariable (accObject);
1284
1305
ResolveAccObject (accObject, accFlag);
1285
1306
}
1286
1307
}
0 commit comments