Commit 9069a4c9 by Martin Sebor Committed by Martin Sebor

PR c/88363 - alloc_align attribute doesn't accept enumerated arguments

gcc/c-family/ChangeLog:

	PR c/88363
	* c-attribs.c (positional_argument): Also accept enumerated types.

gcc/testsuite/ChangeLog:

	PR c/88363
	* c-c++-common/attributes-4.c: New test.

gcc/ChangeLog:

	PR c/88363
	* doc/extend.texi (attribute alloc_align, alloc_size): Update.

From-SVN: r267583
parent 6908c1dc
2019-01-04 Martin Sebor <msebor@redhat.com>
PR c/88363
* doc/extend.texi (attribute alloc_align, alloc_size): Update.
2019-01-04 Jakub Jelinek <jakub@redhat.com> 2019-01-04 Jakub Jelinek <jakub@redhat.com>
* gdbinit.in: Turn off pagination for the skip commands, restore * gdbinit.in: Turn off pagination for the skip commands, restore
......
2019-01-04 Martin Sebor <msebor@redhat.com>
PR c/88363
* c-attribs.c (positional_argument): Also accept enumerated types.
2019-01-01 Jakub Jelinek <jakub@redhat.com> 2019-01-01 Jakub Jelinek <jakub@redhat.com>
Update copyright years. Update copyright years.
......
...@@ -498,10 +498,11 @@ attribute_takes_identifier_p (const_tree attr_id) ...@@ -498,10 +498,11 @@ attribute_takes_identifier_p (const_tree attr_id)
/* Verify that argument value POS at position ARGNO to attribute NAME /* Verify that argument value POS at position ARGNO to attribute NAME
applied to function TYPE refers to a function parameter at position applied to function TYPE refers to a function parameter at position
POS and the expected type CODE. If so, return POS after default POS and the expected type CODE. Treat CODE == INTEGER_TYPE as
conversions, if any. Otherwise, issue appropriate warnings and matching all C integral types except bool. If successful, return
return null. A non-zero 1-based ARGNO should be passed ib by POS after default conversions, if any. Otherwise, issue appropriate
callers only for attributes with more than one argument. */ warnings and return null. A non-zero 1-based ARGNO should be passed
in by callers only for attributes with more than one argument. */
tree tree
positional_argument (const_tree fntype, const_tree atname, tree pos, positional_argument (const_tree fntype, const_tree atname, tree pos,
...@@ -630,17 +631,22 @@ positional_argument (const_tree fntype, const_tree atname, tree pos, ...@@ -630,17 +631,22 @@ positional_argument (const_tree fntype, const_tree atname, tree pos,
return NULL_TREE; return NULL_TREE;
} }
/* Where the expected code is STRING_CST accept any pointer
to a narrow character type, qualified or otherwise. */
bool type_match; bool type_match;
if (code == STRING_CST && POINTER_TYPE_P (argtype)) if (code == STRING_CST && POINTER_TYPE_P (argtype))
{ {
/* Where the expected code is STRING_CST accept any pointer
to a narrow character type, qualified or otherwise. */
tree type = TREE_TYPE (argtype); tree type = TREE_TYPE (argtype);
type = TYPE_MAIN_VARIANT (type); type = TYPE_MAIN_VARIANT (type);
type_match = (type == char_type_node type_match = (type == char_type_node
|| type == signed_char_type_node || type == signed_char_type_node
|| type == unsigned_char_type_node); || type == unsigned_char_type_node);
} }
else if (code == INTEGER_TYPE)
/* For integers, accept enums, wide characters and other types
that match INTEGRAL_TYPE_P except for bool. */
type_match = (INTEGRAL_TYPE_P (argtype)
&& TREE_CODE (argtype) != BOOLEAN_TYPE);
else else
type_match = TREE_CODE (argtype) == code; type_match = TREE_CODE (argtype) == code;
......
...@@ -2487,7 +2487,8 @@ The @code{aligned} attribute can also be used for variables and fields ...@@ -2487,7 +2487,8 @@ The @code{aligned} attribute can also be used for variables and fields
@item alloc_align (@var{position}) @item alloc_align (@var{position})
@cindex @code{alloc_align} function attribute @cindex @code{alloc_align} function attribute
The @code{alloc_align} attribute may be applied to a function that The @code{alloc_align} attribute may be applied to a function that
returns a pointer and takes at least one argument of an integer type. returns a pointer and takes at least one argument of an integer or
enumerated type.
It indicates that the returned pointer is aligned on a boundary given It indicates that the returned pointer is aligned on a boundary given
by the function argument at @var{position}. Meaningful alignments are by the function argument at @var{position}. Meaningful alignments are
powers of 2 greater than one. GCC uses this information to improve powers of 2 greater than one. GCC uses this information to improve
...@@ -2511,7 +2512,8 @@ given by parameter 1. ...@@ -2511,7 +2512,8 @@ given by parameter 1.
@itemx alloc_size (@var{position-1}, @var{position-2}) @itemx alloc_size (@var{position-1}, @var{position-2})
@cindex @code{alloc_size} function attribute @cindex @code{alloc_size} function attribute
The @code{alloc_size} attribute may be applied to a function that The @code{alloc_size} attribute may be applied to a function that
returns a pointer and takes at least one argument of an integer type. returns a pointer and takes at least one argument of an integer or
enumerated type.
It indicates that the returned pointer points to memory whose size is It indicates that the returned pointer points to memory whose size is
given by the function argument at @var{position-1}, or by the product given by the function argument at @var{position-1}, or by the product
of the arguments at @var{position-1} and @var{position-2}. Meaningful of the arguments at @var{position-1} and @var{position-2}. Meaningful
......
2019-01-04 Martin Sebor <msebor@redhat.com>
PR c/88363
* c-c++-common/attributes-4.c: New test.
2019-01-04 Thomas Koenig <tkoenig@gcc.gnu.org> 2019-01-04 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/48543 PR fortran/48543
......
/* PR c/88363 - alloc_align attribute doesn't accept enumerated arguments
Verify that attribute positional arguments can refer to all C integer
types except _Bool in both C and C++.
{ dg-do compile }
{ dg-options "-Wall" }
{ dg-options "-Wall -Wno-c++-compat" { target c } } */
#define ATTR(...) __attribute__ ((__VA_ARGS__))
#if __cplusplus == 199711L
typedef __CHAR16_TYPE__ char16_t;
typedef __CHAR32_TYPE__ char32_t;
#elif !__cplusplus
typedef _Bool bool;
typedef __CHAR16_TYPE__ char16_t;
typedef __CHAR32_TYPE__ char32_t;
typedef __WCHAR_TYPE__ wchar_t;
#endif
enum A { A0 };
ATTR (alloc_align (1)) void* falloc_align_char (char);
ATTR (alloc_align (1)) void* falloc_align_char16 (char16_t);
ATTR (alloc_align (1)) void* falloc_align_char32 (char32_t);
ATTR (alloc_align (1)) void* falloc_align_wchar (wchar_t);
/* Using an enum might make sense in an API that limits the alignments
it accepts to just the set of the defined enumerators. */
ATTR (alloc_align (1)) void* falloc_align_enum (enum A);
ATTR (alloc_align (1)) void* falloc_align_int128 (__int128_t);
ATTR (alloc_align (1)) void* falloc_size_char (char);
ATTR (alloc_size (1)) void* falloc_size_char16 (char16_t);
ATTR (alloc_size (1)) void* falloc_size_char32 (char32_t);
ATTR (alloc_size (1)) void* falloc_size_wchar (wchar_t);
ATTR (alloc_size (1)) void* falloc_size_enum (enum A);
ATTR (alloc_align (1)) void* falloc_size_int128 (__int128_t);
typedef struct { int i; } S;
/* Using bool is most likely a bug and so diagnosed even though
it could be accepted. None of the other types makes sense. */
ATTR (alloc_align (1)) void* falloc_align_bool (bool); /* { dg-warning "attribute argument value .1. refers to parameter type .\(_Bool|bool\)" } */
ATTR (alloc_align (1)) void* falloc_align_float (float); /* { dg-warning "attribute argument value .1. refers to parameter type .float" } */
ATTR (alloc_align (1)) void* falloc_align_voidp (void*); /* { dg-warning "attribute argument value .1. refers to parameter type .void ?\\\*" } */
ATTR (alloc_align (1)) void* falloc_align_struct (S); /* { dg-warning "attribute argument value .1. refers to parameter type .S" } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment