mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
6908c1dc6f
commit
9069a4c95d
|
|
@ -1,3 +1,8 @@
|
||||||
|
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
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
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)
|
||||||
|
|
||||||
/* 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,
|
||||||
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
|
||||||
@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.
|
||||||
@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
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
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
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
/* 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" } */
|
||||||
Loading…
Reference in New Issue