@@ -945,33 +945,58 @@ void AccAttributeVisitor::AddRoutineInfoToSymbol(
945945 const auto &clauses = std::get<Fortran::parser::AccClauseList>(x.t );
946946 for (const Fortran::parser::AccClause &clause : clauses.v ) {
947947 if (std::get_if<Fortran::parser::AccClause::Seq>(&clause.u )) {
948- info.set_isSeq ();
948+ if (info.deviceTypeInfos ().empty ()) {
949+ info.set_isSeq ();
950+ } else {
951+ info.deviceTypeInfos ().back ().set_isSeq ();
952+ }
949953 } else if (const auto *gangClause =
950954 std::get_if<Fortran::parser::AccClause::Gang>(&clause.u )) {
951- info.set_isGang ();
955+ if (info.deviceTypeInfos ().empty ()) {
956+ info.set_isGang ();
957+ } else {
958+ info.deviceTypeInfos ().back ().set_isGang ();
959+ }
952960 if (gangClause->v ) {
953961 const Fortran::parser::AccGangArgList &x = *gangClause->v ;
954962 for (const Fortran::parser::AccGangArg &gangArg : x.v ) {
955963 if (const auto *dim =
956964 std::get_if<Fortran::parser::AccGangArg::Dim>(&gangArg.u )) {
957965 if (const auto v{EvaluateInt64 (context_, dim->v )}) {
958- info.set_gangDim (*v);
966+ if (info.deviceTypeInfos ().empty ()) {
967+ info.set_gangDim (*v);
968+ } else {
969+ info.deviceTypeInfos ().back ().set_gangDim (*v);
970+ }
959971 }
960972 }
961973 }
962974 }
963975 } else if (std::get_if<Fortran::parser::AccClause::Vector>(&clause.u )) {
964- info.set_isVector ();
976+ if (info.deviceTypeInfos ().empty ()) {
977+ info.set_isVector ();
978+ } else {
979+ info.deviceTypeInfos ().back ().set_isVector ();
980+ }
965981 } else if (std::get_if<Fortran::parser::AccClause::Worker>(&clause.u )) {
966- info.set_isWorker ();
982+ if (info.deviceTypeInfos ().empty ()) {
983+ info.set_isWorker ();
984+ } else {
985+ info.deviceTypeInfos ().back ().set_isWorker ();
986+ }
967987 } else if (std::get_if<Fortran::parser::AccClause::Nohost>(&clause.u )) {
968988 info.set_isNohost ();
969989 } else if (const auto *bindClause =
970990 std::get_if<Fortran::parser::AccClause::Bind>(&clause.u )) {
971991 if (const auto *name =
972992 std::get_if<Fortran::parser::Name>(&bindClause->v .u )) {
973993 if (Symbol *sym = ResolveFctName (*name)) {
974- info.set_bindName (sym->name ().ToString ());
994+ if (info.deviceTypeInfos ().empty ()) {
995+ info.set_bindName (sym->name ().ToString ());
996+ } else {
997+ info.deviceTypeInfos ().back ().set_bindName (
998+ sym->name ().ToString ());
999+ }
9751000 } else {
9761001 context_.Say ((*name).source ,
9771002 " No function or subroutine declared for '%s'" _err_en_US,
@@ -986,8 +1011,19 @@ void AccAttributeVisitor::AddRoutineInfoToSymbol(
9861011 std::string str{std::get<std::string>(charConst->t )};
9871012 std::stringstream bindName;
9881013 bindName << " \" " << str << " \" " ;
989- info.set_bindName (bindName.str ());
1014+ if (info.deviceTypeInfos ().empty ()) {
1015+ info.set_bindName (bindName.str ());
1016+ } else {
1017+ info.deviceTypeInfos ().back ().set_bindName (bindName.str ());
1018+ }
9901019 }
1020+ } else if (const auto *dType =
1021+ std::get_if<Fortran::parser::AccClause::DeviceType>(
1022+ &clause.u )) {
1023+ const parser::AccDeviceTypeExprList &deviceTypeExprList = dType->v ;
1024+ OpenACCRoutineDeviceTypeInfo dtypeInfo;
1025+ dtypeInfo.set_dType (deviceTypeExprList.v .front ().v );
1026+ info.add_deviceTypeInfo (dtypeInfo);
9911027 }
9921028 }
9931029 symbol.get <SubprogramDetails>().add_openACCRoutineInfo (info);
0 commit comments