A future patch will make valid_pointer_mode take a scalar_int_mode
instead of a machine_mode.  is_a <...> rather than as_a <...> is
needed here because we're checking a mode supplied by the user.

2017-07-13  Richard Sandiford  <richard.sandif...@linaro.org>
            Alan Hayward  <alan.hayw...@arm.com>
            David Sherwood  <david.sherw...@arm.com>

gcc/c-family/
        * c-attribs.c (handle_mode_attribute): Check for a scalar_int_mode
        before calling targetm.addr_space.valid_pointer_mode.

Index: gcc/c-family/c-attribs.c
===================================================================
--- gcc/c-family/c-attribs.c    2017-06-30 12:50:37.302706033 +0100
+++ gcc/c-family/c-attribs.c    2017-07-13 09:18:37.622901759 +0100
@@ -1438,10 +1438,12 @@ handle_mode_attribute (tree *node, tree
 
       if (POINTER_TYPE_P (type))
        {
+         scalar_int_mode addr_mode;
          addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (type));
          tree (*fn)(tree, machine_mode, bool);
 
-         if (!targetm.addr_space.valid_pointer_mode (mode, as))
+         if (!is_a <scalar_int_mode> (mode, &addr_mode)
+             || !targetm.addr_space.valid_pointer_mode (addr_mode, as))
            {
              error ("invalid pointer mode %qs", p);
              return NULL_TREE;
@@ -1451,7 +1453,7 @@ handle_mode_attribute (tree *node, tree
            fn = build_pointer_type_for_mode;
          else
            fn = build_reference_type_for_mode;
-         typefm = fn (TREE_TYPE (type), mode, false);
+         typefm = fn (TREE_TYPE (type), addr_mode, false);
        }
       else
        {

Reply via email to