mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
c-family: copy attribute diagnostic fixes [PR113262]
The copy attributes is allowed on decls as well as types and even has checks whether decl (set to *node) is DECL_P or TYPE_P, but for diagnostics unconditionally uses DECL_SOURCE_LOCATION (decl), which obviously only works if it applies to a decl. 2024-01-09 Jakub Jelinek <jakub@redhat.com> PR c/113262 * c-attribs.cc (handle_copy_attribute): Don't use DECL_SOURCE_LOCATION (decl) if decl is not DECL_P, use input_location instead. Formatting fixes. * gcc.dg/pr113262.c: New test.
This commit is contained in:
parent
80bb94e88f
commit
c9fc7f398e
@ -3143,13 +3143,14 @@ handle_copy_attribute (tree *node, tree name, tree args,
|
||||
if (ref == error_mark_node)
|
||||
return NULL_TREE;
|
||||
|
||||
location_t loc = input_location;
|
||||
if (DECL_P (decl))
|
||||
loc = DECL_SOURCE_LOCATION (decl);
|
||||
if (TREE_CODE (ref) == STRING_CST)
|
||||
{
|
||||
/* Explicitly handle this case since using a string literal
|
||||
as an argument is a likely mistake. */
|
||||
error_at (DECL_SOURCE_LOCATION (decl),
|
||||
"%qE attribute argument cannot be a string",
|
||||
name);
|
||||
error_at (loc, "%qE attribute argument cannot be a string", name);
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
@ -3160,10 +3161,8 @@ handle_copy_attribute (tree *node, tree name, tree args,
|
||||
/* Similar to the string case, since some function attributes
|
||||
accept literal numbers as arguments (e.g., alloc_size or
|
||||
nonnull) using one here is a likely mistake. */
|
||||
error_at (DECL_SOURCE_LOCATION (decl),
|
||||
"%qE attribute argument cannot be a constant arithmetic "
|
||||
"expression",
|
||||
name);
|
||||
error_at (loc, "%qE attribute argument cannot be a constant arithmetic "
|
||||
"expression", name);
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
@ -3171,12 +3170,11 @@ handle_copy_attribute (tree *node, tree name, tree args,
|
||||
{
|
||||
/* Another possible mistake (but indirect self-references aren't
|
||||
and diagnosed and shouldn't be). */
|
||||
if (warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes,
|
||||
if (warning_at (loc, OPT_Wattributes,
|
||||
"%qE attribute ignored on a redeclaration "
|
||||
"of the referenced symbol",
|
||||
name))
|
||||
inform (DECL_SOURCE_LOCATION (node[1]),
|
||||
"previous declaration here");
|
||||
"of the referenced symbol", name)
|
||||
&& DECL_P (node[1]))
|
||||
inform (DECL_SOURCE_LOCATION (node[1]), "previous declaration here");
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
@ -3196,7 +3194,8 @@ handle_copy_attribute (tree *node, tree name, tree args,
|
||||
ref = TREE_OPERAND (ref, 1);
|
||||
else
|
||||
break;
|
||||
} while (!DECL_P (ref));
|
||||
}
|
||||
while (!DECL_P (ref));
|
||||
|
||||
/* For object pointer expressions, consider those to be requests
|
||||
to copy from their type, such as in:
|
||||
@ -3228,8 +3227,7 @@ handle_copy_attribute (tree *node, tree name, tree args,
|
||||
to a variable, or variable attributes to a function. */
|
||||
if (warning (OPT_Wattributes,
|
||||
"%qE attribute ignored on a declaration of "
|
||||
"a different kind than referenced symbol",
|
||||
name)
|
||||
"a different kind than referenced symbol", name)
|
||||
&& DECL_P (ref))
|
||||
inform (DECL_SOURCE_LOCATION (ref),
|
||||
"symbol %qD referenced by %qD declared here", ref, decl);
|
||||
@ -3279,9 +3277,7 @@ handle_copy_attribute (tree *node, tree name, tree args,
|
||||
}
|
||||
else if (!TYPE_P (decl))
|
||||
{
|
||||
error_at (DECL_SOURCE_LOCATION (decl),
|
||||
"%qE attribute must apply to a declaration",
|
||||
name);
|
||||
error_at (loc, "%qE attribute must apply to a declaration", name);
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
|
6
gcc/testsuite/gcc.dg/pr113262.c
Normal file
6
gcc/testsuite/gcc.dg/pr113262.c
Normal file
@ -0,0 +1,6 @@
|
||||
/* PR c/113262 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "" } */
|
||||
|
||||
int [[gnu::copy ("")]] a; /* { dg-error "'copy' attribute argument cannot be a string" } */
|
||||
|
Loading…
Reference in New Issue
Block a user