diff options
author | Martin Sebor <msebor@redhat.com> | 2019-11-22 17:14:17 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2019-11-22 10:14:17 -0700 |
commit | 54aa6b58fe2fe73bbe67e0485777e0c410a18673 (patch) | |
tree | 11281ae8b5d5a5f2a57ffc60d7d8cfe951a953d8 /gcc/attribs.c | |
parent | b5338fb359ea3480d6ed37bbc52fe2df49b82fb9 (diff) | |
download | gcc-54aa6b58fe2fe73bbe67e0485777e0c410a18673.tar.gz |
PR middle-end/83859 - attributes to associate pointer arguments and sizes
gcc/ChangeLog:
PR middle-end/83859
* attribs.h (struct attr_access): New.
* attribs.c (decl_attributes): Add an informational note.
* builtins.c (check_access): Make extern. Consistently set no-warning
after issuing a warning. Handle calls through function pointers. Set
no-warning.
* builtins.h (check_access): Declare.
* calls.c (rdwr_access_hash): New type.
(rdwr_map): Same.
(init_attr_rdwr_indices): New function.
(maybe_warn_rdwr_sizes): Same.
(initialize_argument_information): Call init_attr_rdwr_indices.
Call maybe_warn_rdwr_sizes.
(get_size_range): Avoid null argument.
* doc/extend.texi (attribute access): Document new attribute.
gcc/c-family/ChangeLog:
PR middle-end/83859
* c-attribs.c (handle_access_attribute): New function.
(c_common_attribute_table): Add new attribute.
(get_argument_type): New function.
(append_access_attrs): New function.
(get_nonnull_operand): Rename...
(get_attribute_operand): ...to this.
* c-common.c (get_nonnull_operand): Rename...
(get_attribute_operand): ...to this.
gcc/testsuite/ChangeLog:
PR middle-end/83859
* c-c++-common/attr-nonstring-8.c: Adjust text of expected warning.
* gcc.dg/Wstringop-overflow-23.c: New test.
* gcc.dg/Wstringop-overflow-24.c: New test.
* gcc.dg/attr-access-read-only.c: New test.
* gcc.dg/attr-access-read-write.c: New test.
* gcc.dg/attr-access-read-write-2.c: New test.
* gcc.dg/attr-access-write-only.c: New test.
From-SVN: r278624
Diffstat (limited to 'gcc/attribs.c')
-rw-r--r-- | gcc/attribs.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/attribs.c b/gcc/attribs.c index b89be5834de..de34918919b 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -573,13 +573,23 @@ decl_attributes (tree *node, tree attributes, int flags, } continue; } - else if (list_length (args) < spec->min_length - || (spec->max_length >= 0 - && list_length (args) > spec->max_length)) + else { - error ("wrong number of arguments specified for %qE attribute", - name); - continue; + int nargs = list_length (args); + if (nargs < spec->min_length + || (spec->max_length >= 0 + && nargs > spec->max_length)) + { + error ("wrong number of arguments specified for %qE attribute", + name); + if (spec->max_length < 0) + inform (input_location, "expected %i or more, found %i", + spec->min_length, nargs); + else + inform (input_location, "expected between %i and %i, found %i", + spec->min_length, spec->max_length, nargs); + continue; + } } gcc_assert (is_attribute_p (spec->name, name)); |