------- Comment #7 from bonzini at gnu dot org 2008-10-17 11:12 ------- Totally untested patch.
Index: c-common.c =================================================================== --- c-common.c (revisione 134435) +++ c-common.c (copia locale) @@ -6762,7 +6762,8 @@ c_warn_unused_result (tree *top_p) ftype = TREE_TYPE (ftype); } - if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype))) + if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)) + && !TREE_NO_WARNING (t)) { if (fdecl) warning (0, "%Hignoring return value of %qD, " Index: c-convert.c =================================================================== --- c-convert.c (revisione 134435) +++ c-convert.c (copia locale) @@ -96,7 +96,11 @@ convert (tree type, tree expr) return error_mark_node; } if (code == VOID_TYPE) - return fold_convert (type, e); + { + if (TREE_CODE (e) == CALL_EXPR) + TREE_NO_WARNING (e) == 1; + return fold_convert (type, e); + } if (code == INTEGER_TYPE || code == ENUMERAL_TYPE) return fold (convert_to_integer (type, e)); if (code == BOOLEAN_TYPE) Index: cp/cvt.c =================================================================== --- cp/cvt.c (revisione 134435) +++ cp/cvt.c (copia locale) @@ -825,6 +825,7 @@ convert_to_void (tree expr, const char * break; case CALL_EXPR: /* We have a special meaning for volatile void fn(). */ + TREE_NO_WARNING (expr) = 1; break; case INDIRECT_REF: -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35579