Commit 45484dcf by Marek Polacek Committed by Marek Polacek

re PR c/18079 (Contradicting function attributes (always_inline vs noinline))

	PR c/18079
c/
	* c-decl.c (diagnose_mismatched_decls): Warn for mismatched
	always_inline/noinline and hot/cold attributes.
c-family/
	* c-common.c (handle_noinline_attribute): Warn if the attribute
	conflicts with always_inline attribute.
	(handle_always_inline_attribute): Warn if the attribute conflicts
	with noinline attribute.
testsuite/
	* gcc.dg/pr18079.c: New test.
	* gcc.dg/pr18079-2.c: New test.

From-SVN: r209796
parent 707d7757
2014-04-25 Marek Polacek <polacek@redhat.com> 2014-04-25 Marek Polacek <polacek@redhat.com>
PR c/18079
* c-common.c (handle_noinline_attribute): Warn if the attribute
conflicts with always_inline attribute.
(handle_always_inline_attribute): Warn if the attribute conflicts
with noinline attribute.
2014-04-25 Marek Polacek <polacek@redhat.com>
PR c/60156 PR c/60156
* c-common.c (check_main_parameter_types): Warn about variadic main. * c-common.c (check_main_parameter_types): Warn about variadic main.
......
...@@ -6568,8 +6568,8 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args), ...@@ -6568,8 +6568,8 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args),
{ {
if (lookup_attribute ("cold", DECL_ATTRIBUTES (*node)) != NULL) if (lookup_attribute ("cold", DECL_ATTRIBUTES (*node)) != NULL)
{ {
warning (OPT_Wattributes, "%qE attribute conflicts with attribute %s", warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
name, "cold"); "with attribute %qs", name, "cold");
*no_add_attrs = true; *no_add_attrs = true;
} }
/* Most of the rest of the hot processing is done later with /* Most of the rest of the hot processing is done later with
...@@ -6596,8 +6596,8 @@ handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args), ...@@ -6596,8 +6596,8 @@ handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args),
{ {
if (lookup_attribute ("hot", DECL_ATTRIBUTES (*node)) != NULL) if (lookup_attribute ("hot", DECL_ATTRIBUTES (*node)) != NULL)
{ {
warning (OPT_Wattributes, "%qE attribute conflicts with attribute %s", warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
name, "hot"); "with attribute %qs", name, "hot");
*no_add_attrs = true; *no_add_attrs = true;
} }
/* Most of the rest of the cold processing is done later with /* Most of the rest of the cold processing is done later with
...@@ -6670,7 +6670,16 @@ handle_noinline_attribute (tree *node, tree name, ...@@ -6670,7 +6670,16 @@ handle_noinline_attribute (tree *node, tree name,
int ARG_UNUSED (flags), bool *no_add_attrs) int ARG_UNUSED (flags), bool *no_add_attrs)
{ {
if (TREE_CODE (*node) == FUNCTION_DECL) if (TREE_CODE (*node) == FUNCTION_DECL)
DECL_UNINLINABLE (*node) = 1; {
if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
{
warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
"with attribute %qs", name, "always_inline");
*no_add_attrs = true;
}
else
DECL_UNINLINABLE (*node) = 1;
}
else else
{ {
warning (OPT_Wattributes, "%qE attribute ignored", name); warning (OPT_Wattributes, "%qE attribute ignored", name);
...@@ -6708,9 +6717,16 @@ handle_always_inline_attribute (tree *node, tree name, ...@@ -6708,9 +6717,16 @@ handle_always_inline_attribute (tree *node, tree name,
{ {
if (TREE_CODE (*node) == FUNCTION_DECL) if (TREE_CODE (*node) == FUNCTION_DECL)
{ {
/* Set the attribute and mark it for disregarding inline if (lookup_attribute ("noinline", DECL_ATTRIBUTES (*node)))
limits. */ {
DECL_DISREGARD_INLINE_LIMITS (*node) = 1; warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
"with %qs attribute", name, "noinline");
*no_add_attrs = true;
}
else
/* Set the attribute and mark it for disregarding inline
limits. */
DECL_DISREGARD_INLINE_LIMITS (*node) = 1;
} }
else else
{ {
......
2014-04-25 Marek Polacek <polacek@redhat.com> 2014-04-25 Marek Polacek <polacek@redhat.com>
PR c/18079
* c-decl.c (diagnose_mismatched_decls): Warn for mismatched
always_inline/noinline and hot/cold attributes.
2014-04-25 Marek Polacek <polacek@redhat.com>
PR c/60114 PR c/60114
* c-parser.c (c_parser_initelt): Pass input_location to * c-parser.c (c_parser_initelt): Pass input_location to
process_init_element. process_init_element.
......
...@@ -2099,18 +2099,38 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, ...@@ -2099,18 +2099,38 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
/* Diagnose inline __attribute__ ((noinline)) which is silly. */ /* Diagnose inline __attribute__ ((noinline)) which is silly. */
if (DECL_DECLARED_INLINE_P (newdecl) if (DECL_DECLARED_INLINE_P (newdecl)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
{ warned |= warning (OPT_Wattributes,
warned |= warning (OPT_Wattributes, "inline declaration of %qD follows "
"inline declaration of %qD follows " "declaration with attribute noinline", newdecl);
"declaration with attribute noinline", newdecl);
}
else if (DECL_DECLARED_INLINE_P (olddecl) else if (DECL_DECLARED_INLINE_P (olddecl)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
{ warned |= warning (OPT_Wattributes,
warned |= warning (OPT_Wattributes, "declaration of %q+D with attribute "
"declaration of %q+D with attribute " "noinline follows inline declaration ", newdecl);
"noinline follows inline declaration ", newdecl); else if (lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))
} && lookup_attribute ("always_inline", DECL_ATTRIBUTES (olddecl)))
warned |= warning (OPT_Wattributes,
"declaration of %q+D with attribute "
"%qs follows declaration with attribute %qs",
newdecl, "noinline", "always_inline");
else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (newdecl))
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
warned |= warning (OPT_Wattributes,
"declaration of %q+D with attribute "
"%qs follows declaration with attribute %qs",
newdecl, "always_inline", "noinline");
else if (lookup_attribute ("cold", DECL_ATTRIBUTES (newdecl))
&& lookup_attribute ("hot", DECL_ATTRIBUTES (olddecl)))
warned |= warning (OPT_Wattributes,
"declaration of %q+D with attribute %qs follows "
"declaration with attribute %qs", newdecl, "cold",
"hot");
else if (lookup_attribute ("hot", DECL_ATTRIBUTES (newdecl))
&& lookup_attribute ("cold", DECL_ATTRIBUTES (olddecl)))
warned |= warning (OPT_Wattributes,
"declaration of %q+D with attribute %qs follows "
"declaration with attribute %qs", newdecl, "hot",
"cold");
} }
else /* PARM_DECL, VAR_DECL */ else /* PARM_DECL, VAR_DECL */
{ {
......
2014-04-25 Marek Polacek <polacek@redhat.com>
PR c/18079
* gcc.dg/pr18079.c: New test.
* gcc.dg/pr18079-2.c: New test.
2014-04-25 Uros Bizjak <ubizjak@gmail.com> 2014-04-25 Uros Bizjak <ubizjak@gmail.com>
* c-c++-common/gomp/pr60823-2.c: Require effective target * c-c++-common/gomp/pr60823-2.c: Require effective target
......
/* PR c/18079 */
/* { dg-do compile } */
/* { dg-options "-Wall" } */
__attribute__ ((always_inline)) void fndecl1 (void);
__attribute__ ((noinline)) void fndecl1 (void); /* { dg-warning "attribute noinline follows declaration with attribute always_inline" } */
__attribute__ ((noinline)) void fndecl2 (void);
__attribute__ ((always_inline)) void fndecl2 (void); /* { dg-warning "attribute always_inline follows declaration with attribute noinline" } */
__attribute__ ((hot)) void fndecl3 (void);
__attribute__ ((cold)) void fndecl3 (void); /* { dg-warning "attribute cold follows declaration with attribute hot" } */
__attribute__ ((cold)) void fndecl4 (void);
__attribute__ ((hot)) void fndecl4 (void); /* { dg-warning "attribute hot follows declaration with attribute cold" } */
/* PR c/18079 */
/* { dg-do compile } */
/* { dg-options "-Wall" } */
__attribute__ ((noinline))
__attribute__ ((always_inline))
int
fn1 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */
return r & 4;
}
__attribute__ ((noinline, always_inline))
int
fn2 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */
return r & 4;
}
__attribute__ ((always_inline))
__attribute__ ((noinline))
inline int
fn3 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */
return r & 8;
}
__attribute__ ((always_inline, noinline))
inline int
fn4 (int r)
{ /* { dg-warning "attribute ignored due to conflict" } */
return r & 8;
}
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