2009-08-12 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Aug 2009 09:03:38 +0000 (09:03 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Aug 2009 09:03:38 +0000 (09:03 +0000)
        PR fortran/41034
        * symbol.c (gfc_copy_attr): Merge bits instead of replace
        bits in gfc_copy_attr.
        * gfc_check_pointer_assign (gfc_check_pointer_assign):
        Initialize ext_attr bits by zero.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150678 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/fortran/symbol.c

index 5674907..33e0c34 100644 (file)
@@ -1,3 +1,11 @@
+2009-08-12  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/41034
+       * symbol.c (gfc_copy_attr): Merge bits instead of replace
+       bits in gfc_copy_attr.
+       * gfc_check_pointer_assign (gfc_check_pointer_assign):
+       Initialize ext_attr bits by zero.
+
 2009-08-11  Richard Guenther  <rguenther@suse.de>
 
        * trans-types.c (gfc_get_derived_type): Do not clear TYPE_CANONICAL.
index b0e58b3..b8d54e7 100644 (file)
@@ -3192,16 +3192,15 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
          && lvalue->symtree->n.sym->attr.ext_attr
               != rvalue->symtree->n.sym->attr.ext_attr)
        {
-         symbol_attribute cdecl, stdcall, fastcall;
-         unsigned calls;
+         symbol_attribute calls;
 
-         gfc_add_ext_attribute (&cdecl, EXT_ATTR_CDECL, NULL);
-         gfc_add_ext_attribute (&stdcall, EXT_ATTR_STDCALL, NULL);
-         gfc_add_ext_attribute (&fastcall, EXT_ATTR_FASTCALL, NULL);
-         calls = cdecl.ext_attr | stdcall.ext_attr | fastcall.ext_attr;
+         calls.ext_attr = 0;
+         gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
+         gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
+         gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
 
-         if ((calls & lvalue->symtree->n.sym->attr.ext_attr)
-             != (calls & rvalue->symtree->n.sym->attr.ext_attr))
+         if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
+             != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
            {
              gfc_error ("Mismatch in the procedure pointer assignment "
                         "at %L: mismatch in the calling convention",
index c2666ae..27f378c 100644 (file)
@@ -1641,7 +1641,9 @@ gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
 {
   int is_proc_lang_bind_spec;
   
-  dest->ext_attr = src->ext_attr;
+  /* In line with the other attributes, we only add bits but do not remove
+     them; cf. also PR 41034.  */
+  dest->ext_attr |= src->ext_attr;
 
   if (src->allocatable && gfc_add_allocatable (dest, where) == FAILURE)
     goto fail;
@@ -1712,7 +1714,7 @@ gfc_copy_attr (symbol_attribute *dest, symbol_attribute *src, locus *where)
   if (src->cray_pointer && gfc_add_cray_pointer (dest, where) == FAILURE)
     goto fail;
   if (src->cray_pointee && gfc_add_cray_pointee (dest, where) == FAILURE)
-    goto fail;    
+    goto fail;
 
   is_proc_lang_bind_spec = (src->flavor == FL_PROCEDURE ? 1 : 0);
   if (src->is_bind_c