(Not a proper review really.)

On Tue, Aug 08, 2017 at 10:13:07AM -0600, Martin Sebor wrote:
> @@ -490,7 +583,9 @@ decl_attributes (tree *node, tree attributes, int flags)
>                      | (int) ATTR_FLAG_ARRAY_NEXT))
>           {
>             /* Pass on this attribute to be tried again.  */
> -           returned_attrs = tree_cons (name, args, returned_attrs);
> +           tree attr = tree_cons (name, args, NULL_TREE);
> +           returned_attrs = chainon (returned_attrs, attr);
> +           // returned_attrs = tree_cons (name, args, returned_attrs);
>             continue;
>           }
>         else
> @@ -535,7 +630,9 @@ decl_attributes (tree *node, tree attributes, int flags)
>         else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
>           {
>             /* Pass on this attribute to be tried again.  */
> -           returned_attrs = tree_cons (name, args, returned_attrs);
> +           tree attr = tree_cons (name, args, NULL_TREE);
> +           returned_attrs = chainon (returned_attrs, attr);
> +           // returned_attrs = tree_cons (name, args, returned_attrs);

What's with these // lines?  I suppose they weren't supposed to be here.

> +      /* If the attribute was sussceefully handled on its own and is

"successfully"

> diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c
> index e970ab2..8bbfcb5 100644
> --- a/gcc/c-family/c-warn.c
> +++ b/gcc/c-family/c-warn.c
> @@ -2143,36 +2143,19 @@ diagnose_mismatched_attributes (tree olddecl, tree 
> newdecl)
>                      newdecl);
>  
>    /* Diagnose inline __attribute__ ((noinline)) which is silly.  */
> +  const char* noinline = "noinline";

"const char *noinline"

> --- a/gcc/cp/name-lookup.c
> +++ b/gcc/cp/name-lookup.c
> @@ -2291,6 +2291,71 @@ set_local_extern_decl_linkage (tree decl, bool 
> shadowed)
>      }
>  }
>  
> +/* Given a new DECL that hasn't been pushed yet, try to find the last
> +   DECL for the same symbol and return it, oterwise return null.  */
> +
> +tree
> +find_decl (tree decl)
> +{
> +  if (!DECL_P (decl))
> +    return NULL_TREE;
> +
> +  /* if (!DECL_TEMPLATE_PARM_P (decl) && current_function_decl) */
> +  /*   set_decl_context_in_fn (current_function_decl, decl); */

Looks like some stray lines.

> +
> +  /* The binding level we will be pushing into.  During local class
> +     pushing, we want to push to the containing scope.  */
> +  cp_binding_level *level = current_binding_level;
> +  while (level->kind == sk_class)
> +    level = level->level_chain;
> +
> +  tree name = DECL_NAME (decl);
> +  if (!name)
> +    return NULL_TREE;
> +
> +  cxx_binding *binding = NULL; /* Local scope binding.  */
> +  tree ns = NULL_TREE; /* Searched namespace.  */
> +  tree *slot = NULL; /* Binding slot in namespace.  */
> +  tree old = NULL_TREE;
> +
> +  if (level->kind == sk_namespace)
> +    {
> +      /* We look in the decl's namespace for an existing
> +      declaration, even though we push into the current
> +      namespace.  */
> +      ns = (DECL_NAMESPACE_SCOPE_P (decl)
> +         ? CP_DECL_CONTEXT (decl) : current_namespace);
> +      /* Create the binding, if this is current namespace, because
> +      that's where we'll be pushing anyway.  */
> +      slot = find_namespace_slot (ns, name, ns == current_namespace);
> +      if (slot)
> +     old = MAYBE_STAT_DECL (*slot);
> +    }
> +  else
> +    {
> +      binding = find_local_binding (level, name);
> +      if (binding)
> +     old = binding->value;
> +    }
> +
> +  /* if (current_function_decl && VAR_OR_FUNCTION_DECL_P (decl) */
> +  /*     && DECL_EXTERNAL (decl)) */
> +  /*   set_local_extern_decl_linkage (decl, old != NULL_TREE); */

Here too.

> +  if (old == error_mark_node)
> +    old = NULL_TREE;
> +
> +  for (ovl_iterator iter (old); iter; ++iter)
> +    {
> +      if (iter.using_p ())
> +     ; /* Ignore using decls here.  */
> +      else if (decls_match (decl, *iter, /*record_decls=*/false))
> +     return *iter;
> +    }
> +
> +  return NULL_TREE;
> +}
> +
>  /* Record DECL as belonging to the current lexical scope.  Check for
>     errors (such as an incompatible declaration for the same name
>     already seen in the same scope).  IS_FRIEND is true if DECL is
> diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h
> index 2e2075c..ce0826e 100644
> --- a/gcc/cp/name-lookup.h
> +++ b/gcc/cp/name-lookup.h
> @@ -339,4 +339,6 @@ extern void pop_nested_namespace (tree);
>  extern void push_to_top_level (void);
>  extern void pop_from_top_level (void);
>  
> +extern tree find_decl (tree);
> +
>  #endif /* GCC_CP_NAME_LOOKUP_H */
> diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
> index 8f18665..6cbf4b2 100644
> --- a/gcc/cp/tree.c
> +++ b/gcc/cp/tree.c
> @@ -4314,10 +4314,10 @@ const struct attribute_spec cxx_attribute_table[] =
>    /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
>         affects_type_identity } */
>    { "init_priority",  1, 1, true,  false, false,
> -    handle_init_priority_attribute, false },
> +    handle_init_priority_attribute, false, NULL },
>    { "abi_tag", 1, -1, false, false, false,
> -    handle_abi_tag_attribute, true },
> -  { NULL,          0, 0, false, false, false, NULL, false }
> +    handle_abi_tag_attribute, true, NULL },
> +  { NULL, 0, 0, false, false, false, NULL, false, NULL }
>  };
>  
>  /* Table of C++ standard attributes.  */
> @@ -4326,10 +4326,10 @@ const struct attribute_spec std_attribute_table[] =
>    /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
>         affects_type_identity } */
>    { "maybe_unused", 0, 0, false, false, false,
> -    handle_unused_attribute, false },
> +    handle_unused_attribute, false, NULL },
>    { "nodiscard", 0, 0, false, false, false,
> -    handle_nodiscard_attribute, false },
> -  { NULL,          0, 0, false, false, false, NULL, false }
> +    handle_nodiscard_attribute, false, NULL },
> +  { NULL, 0, 0, false, false, false, NULL, false, NULL }
>  };
>  
>  /* Handle an "init_priority" attribute; arguments as in
> diff --git a/gcc/tree-core.h b/gcc/tree-core.h
> index 278d0c9..943b349 100644
> --- a/gcc/tree-core.h
> +++ b/gcc/tree-core.h
> @@ -1933,6 +1933,20 @@ struct attribute_spec {
>                  int flags, bool *no_add_attrs);
>    /* Specifies if attribute affects type's identity.  */
>    bool affects_type_identity;
> +
> +  /* Specifies the name of an attribute that's mutually exclusive with
> +     this one, and whether the relationship applies to the function,
> +     variable, or type form of the attribute.  */
> +  struct exclusions {
> +    const char* name;

"const char *name"

> +    bool function;
> +    bool variable;
> +    bool type;
> +  };
> +
> +  /* An array of attribute exclusions describing names of other attributes
> +     that this attribute is mutually exclusive with.  */
> +  const exclusions* exclude;

"const exclusions *exclude;"

>  };
>  
>  /* These functions allow a front-end to perform a manual layout of a
> diff --git a/libstdc++-v3/include/ext/mt_allocator.h 
> b/libstdc++-v3/include/ext/mt_allocator.h
> index effb13b..f349ff8 100644
> --- a/libstdc++-v3/include/ext/mt_allocator.h
> +++ b/libstdc++-v3/include/ext/mt_allocator.h
> @@ -355,7 +355,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>        }
>  
>        // XXX GLIBCXX_ABI Deprecated
> -      _GLIBCXX_CONST void 
> +      void 
>        _M_destroy_thread_key(void*) throw ();
>  
>        size_t 

Why this change?  Seems unrelated.

> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-2.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-2.c
> index 146b76c..58a4742 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-2.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-2.c
> @@ -113,7 +113,7 @@ int test9 (int *intarr)
>  
>  int test99 (int *intarr)
>  {
> -  extern int foo9 (int) __attribute__ ((pure));
> +  extern int foo9 (int) __attribute__ ((const));
>    int h, v;
>    g9 = 9;
>    h = foo9 (g9);
> 

And why this?  I'd avoid modifying existing tests like that unless
it's directly related to the new diagnostic.

        Marek

Reply via email to