https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100988

            Bug ID: 100988
           Summary: Missed optimization: RESTRICT missing for optional
                    arguments
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
  Target Milestone: ---

For
  subroutine foo(a, b)
    integer :: a, b
    optional :: b
    ...
  end subroutine

only the TREE_TYPE of 'a' has the restrict qualifier – and not 'b'.

I think that there is no good reason for this – and wonder whether the
following should be applied:

diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 5582e404df9..c4b4387c1e2 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -2338,11 +2338,9 @@ gfc_sym_type (gfc_symbol * sym)
          || (sym->ns->proc_name && sym->ns->proc_name->attr.entry_master))
        type = build_pointer_type (type);
       else
-       {
-         type = build_reference_type (type);
-         if (restricted)
-           type = build_qualified_type (type, TYPE_QUAL_RESTRICT);
-       }
+       type = build_reference_type (type);
+      if (restricted)
+       type = build_qualified_type (type, TYPE_QUAL_RESTRICT);
     }

   return (type);

Reply via email to