Hello, I prepared patch that give more precise control over __attribute__((warning)). Currently when you use "warning" attribute with "-Werror" option warning become error and there is no way to ignore this error.
With suggested changes it will be possible to use "-Werror -Wno-error=warning-attribute" to compile code with warning attributes. This particular case added as new testcase. I tested suggested changes in two cases: with gcc-trunk compiled on GuixSD with GCC 5.5 on amd64 machine and as patch to gcc 6.2.0 inside of Yocto 2.2 environment on Ubuntu 14.04 on amd64 machine. Regards, Nikolai gcc/Changelog 2018-09-29 Nikolai Merinov <n.meri...@inango-systems.com> * gcc/common.opt: Add -Wwarning-attribute. * gcc/doc/invoke.texi: Add documentation for -Wno-warning-attribute. * gcc/testsuite/gcc.dg/Wno-warning-attribute.c: New test. * gcc/expr.c (expand_expr_real_1): Add new attribute to warning_at call to allow user configure behavior of "warning" attribute
Index: gcc/common.opt =================================================================== --- gcc/common.opt (revision 264725) +++ gcc/common.opt (working copy) @@ -571,6 +571,10 @@ Wcpp Common Var(warn_cpp) Init(1) Warning Warn when a #warning directive is encountered. +Wwarning-attribute +Common Var(warn_warning_attribute) Init(1) Warning +Warn about uses of __attribute__((warning)) declarations. + Wdeprecated-declarations Common Var(warn_deprecated_decl) Init(1) Warning Warn about uses of __attribute__((deprecated)) declarations. Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 264725) +++ gcc/doc/invoke.texi (working copy) @@ -291,6 +291,7 @@ Objective-C and Objective-C++ Dialects}. -Wclobbered -Wcomment -Wconditionally-supported @gol -Wconversion -Wcoverage-mismatch -Wno-cpp -Wdangling-else -Wdate-time @gol -Wdelete-incomplete @gol +-Wno-warning-attribute @gol -Wno-deprecated -Wno-deprecated-declarations -Wno-designated-init @gol -Wdisabled-optimization @gol -Wno-discarded-qualifiers -Wno-discarded-array-qualifiers @gol @@ -6940,6 +6941,15 @@ confused with the digit 0, and so is not the defau useful as a local coding convention if the programming environment cannot be fixed to display these characters distinctly. +@item -Wno-warning-attribute +@opindex Wno-warning-attribute +@opindex Wwarning-attribute +Do not warn about usage of functions (@pxref{Function Attributes}) +declared with @code{warning} attribute. By default, this warning is +enabled. @option{-Wno-warning-attribute} can be used to disable the +warning or @option{-Wno-error=warning-attribute} can be used to +disable the error when compiled with @option{-Werror} flag. + @item -Wno-deprecated @opindex Wno-deprecated @opindex Wdeprecated Index: gcc/expr.c =================================================================== --- gcc/expr.c (revision 264725) +++ gcc/expr.c (working copy) @@ -10930,7 +10930,8 @@ expand_expr_real_1 (tree exp, rtx target, machine_ DECL_ATTRIBUTES (fndecl))) != NULL) { const char *ident = lang_hooks.decl_printable_name (fndecl, 1); - warning_at (tree_nonartificial_location (exp), 0, + warning_at (tree_nonartificial_location (exp), + OPT_Wwarning_attribute, "%Kcall to %qs declared with attribute warning: %s", exp, identifier_to_locale (ident), TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr)))); Index: gcc/testsuite/gcc.dg/Wno-warning-attribute.c =================================================================== --- gcc/testsuite/gcc.dg/Wno-warning-attribute.c (revision 0) +++ gcc/testsuite/gcc.dg/Wno-warning-attribute.c (working copy) @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-Werror -Wno-error=warning-attribute" } */ + +int f1(void) __attribute__ ((warning("Please avoid f1"))); +int func1(void) +{ + return f1(); /* { dg-warning "'f1' declared with attribute warning: Please avoid f1" } */ +}