[openacc] Ensure oacc_replace_fn_attrib replaces Atm, in oacc_replace_fn_attrib we only replace the oacc function attribute if it's the first. So, for a parallel region we have: ... __attribute__((oacc function (, 20, ), omp target entrypoint)) ... which is replaced by: ... __attribute__((oacc function (1, 20, 32), omp target entrypoint)) ... But for a routine: ... __attribute__((omp declare target, oacc function (0 1, 0 1, 0 1))) ... we get instead: ... __attribute__((oacc function (0 1, 0 1, 0 1), omp declare target, oacc function (0 1, 0 1, 0 1))) ... Fix this confusing behaviour by ensuring the oacc function attribute is indeed replaced. --- gcc/omp-general.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gcc/omp-general.c b/gcc/omp-general.c index 99d8226ef21..e37a6e0b96c 100644 --- a/gcc/omp-general.c +++ b/gcc/omp-general.c @@ -545,9 +545,13 @@ oacc_replace_fn_attrib (tree fn, tree dims) tree ident = get_identifier (OACC_FN_ATTRIB); tree attribs = DECL_ATTRIBUTES (fn); - /* If we happen to be present as the first attrib, drop it. */ - if (attribs && TREE_PURPOSE (attribs) == ident) - attribs = TREE_CHAIN (attribs); + tree *elem = &attribs; + while (*elem && TREE_PURPOSE (*elem) != ident) + elem = &TREE_CHAIN (attribs); + + if (*elem) + *elem = TREE_CHAIN (*elem); + DECL_ATTRIBUTES (fn) = tree_cons (ident, dims, attribs); }