diff --git a/flang/lib/Semantics/check-acc-structure.cpp b/flang/lib/Semantics/check-acc-structure.cpp index 5e87b834edf7e..eda824f08e6e5 100644 --- a/flang/lib/Semantics/check-acc-structure.cpp +++ b/flang/lib/Semantics/check-acc-structure.cpp @@ -712,28 +712,37 @@ void AccStructureChecker::CheckMultipleOccurrenceInDeclare( [&](const parser::Designator &designator) { if (const auto *name = parser::GetDesignatorNameIfDataRef(designator)) { - if (declareSymbols.contains(&name->symbol->GetUltimate())) { - if (declareSymbols[&name->symbol->GetUltimate()] == clause) { - context_.Warn(common::UsageWarning::OpenAccUsage, - GetContext().clauseSource, - "'%s' in the %s clause is already present in the same clause in this module"_warn_en_US, - name->symbol->name(), - parser::ToUpperCaseLetters( - llvm::acc::getOpenACCClauseName(clause).str())); - } else { - context_.Say(GetContext().clauseSource, - "'%s' in the %s clause is already present in another " - "%s clause in this module"_err_en_US, - name->symbol->name(), - parser::ToUpperCaseLetters( - llvm::acc::getOpenACCClauseName(clause).str()), - parser::ToUpperCaseLetters( - llvm::acc::getOpenACCClauseName( - declareSymbols[&name->symbol->GetUltimate()]) - .str())); + if (!name->symbol) { + context_.Say(GetContext().clauseSource, + "'%s' is not an appropriate symbol for %s clause"_err_en_US, + name->ToString().c_str(), + parser::ToUpperCaseLetters( + llvm::acc::getOpenACCClauseName(clause).str())); + } else { + if (declareSymbols.contains(&name->symbol->GetUltimate())) { + if (declareSymbols[&name->symbol->GetUltimate()] == + clause) { + context_.Warn(common::UsageWarning::OpenAccUsage, + GetContext().clauseSource, + "'%s' in the %s clause is already present in the same clause in this module"_warn_en_US, + name->symbol->name(), + parser::ToUpperCaseLetters( + llvm::acc::getOpenACCClauseName(clause).str())); + } else { + context_.Say(GetContext().clauseSource, + "'%s' in the %s clause is already present in another " + "%s clause in this module"_err_en_US, + name->symbol->name(), + parser::ToUpperCaseLetters( + llvm::acc::getOpenACCClauseName(clause).str()), + parser::ToUpperCaseLetters( + llvm::acc::getOpenACCClauseName( + declareSymbols[&name->symbol->GetUltimate()]) + .str())); + } } + declareSymbols.insert({&name->symbol->GetUltimate(), clause}); } - declareSymbols.insert({&name->symbol->GetUltimate(), clause}); } }, [&](const parser::Name &name) {