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.
gcc/c-family/ 2016-11-24 Richard Sandiford <richard.sandif...@arm.com> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> * c-attribs.c (handle_mode_attribute): Check for a scalar_int_mode before calling targetm.addr_space.valid_pointer_mode. diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index 4c4017a..14b43fe 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -1356,10 +1356,12 @@ handle_mode_attribute (tree *node, tree name, tree args, 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; @@ -1369,7 +1371,7 @@ handle_mode_attribute (tree *node, tree name, tree args, 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 {