Я считаю, что компилятор корректен, чтобы отклонить эту программу.Однако, если у вас есть контракт на поддержку с NAG, я настоятельно рекомендую попросить их принять мои комментарии как окончательные.
Я покажу свои аргументы.
Ясно, что ссылка на конкретную процедуруgeneric_shape_assign
как
type(circle_t) mycirc1, mycirc2
call generic_shape_assign(mycirc2, mycirc1)
недопустимо.Он терпит неудачу, потому что фактический аргумент mycirc2
, соответствующий размещаемому полиморфному фиктивному аргументу lhs
:
- , не подлежит распределению;
- не совпадает с , объявленным введите в качестве соответствующего фиктивного аргумента;
- не является полиморфным.
В сообщении, которое вы цитируете, говорится об отклонении программы за нарушение этой секунды.
Итак, это означает, что generic_shape_assign
не является допустимой конкретной процедурой (для этой ссылки) с общей спецификацией assignment(=)
, верно?И, таким образом, не определено ни одно присвоение, и компилятор должен вернуться к внутреннему присваиванию?
Вот где все становится мутным (по крайней мере, для меня).
Я думаю, что конкретная подпрограмма generic_shape_assign
выбрано для определенного назначения, и поэтому компилятор корректен для отклонения вашей программы, потому что вы неправильно вызываете эту конкретную подпрограмму.
Давайте посмотрим дальше, используя Fortran 2008 7.2.1.4где есть определение того, когда оператор присваивания является определенным оператором присваивания.
Чтобы решить, будет ли подпрограмма generic_shape_assign
определять определенный оператор присваивания mycirc2=mycirc1
, мы смотрим на заданные точки:
generic_shape_assign
- подпрограмма с двумя фиктивными аргументами (lhs
и rhs
здесь); - интерфейсный блок дает
generic_shape_assign
универсальную спецификацию assignment(=)
; lhs
(типа shape_t
) совместим по типу с mycirc2
(динамического типа circle_t
);rhs
аналогично; - нет параметров типа для фиктивных или фактических аргументов;
- ранги (будучи скалярными) фиктивных и фактических аргументов совпадают.
Мы выполняем все требования для того, чтобы это было определенное назначение: нет требования, которое гласит, что определенное назначение требует, чтобы выбранная подпрограмма вызывалась!
В итоге:
ЭтоМне непонятно, почему этот компилятор пытается использовать определенное присваивание в инструкции mycirc2 = mycirc1
, в то время как эти две переменные не могут быть распределенными полиморфными.
Поскольку использование определенного присваивания не связано с тем,левая и правая части являются полиморфными или выделяемыми.
Наконец, я думаю, что диагностическое сообщение от компилятора могло бы быть улучшено независимо от того, верны ли мои рассуждения.