Microcontroller programmers tend to fall into the trap of trying to bind a variable to a CPU register, and declare it "volatile" so they could e.g. use it to communicate between the main context and an ISR. Previous GCC versions issued a warning: volatile register variables don't work as you might wish This warning has been removed without making volatile register variables work the way an innocent programmer would assume. Please re-enable that warning at least for -Wall and/or -Wextra.
use -Wvolatile-register-var
> use -Wvolatile-register-var Could we have that at least as part of one of the "standard" warning switch combinations, either -Wall or -Wextra? I remember a statement from the developer who introduced the change that he wouldn't mind if it were enabled by -Wall.
Moreover, the option is defined in common.opt when it is C/C++ specific. Untested patch: Index: gcc/common.opt =================================================================== --- gcc/common.opt (revision 130605) +++ gcc/common.opt (working copy) @@ -213,10 +213,6 @@ Common Var(warn_unused_variable) Warning Warn when a variable is unused -Wvolatile-register-var -Common Var(warn_register_var) Warning -Warn when a register variable is declared volatile - Wcoverage-mismatch Common RejectNegative Var(warn_coverage_mismatch) Warning Warn instead of error in case profiles in -fprofile-use do not match Index: gcc/c.opt =================================================================== --- gcc/c.opt (revision 130605) +++ gcc/c.opt (working copy) @@ -465,6 +465,10 @@ C ObjC C++ ObjC++ Var(warn_vla) Init(-1) Warning Warn if a variable length array is used +Wvolatile-register-var +C ObjC C++ ObjC++ Var(warn_volatile_register_var) Warning +Warn when a register variable is declared volatile + Wwrite-strings C ObjC C++ ObjC++ Var(warn_write_strings) Warning In C++, nonzero means warn about deprecated conversion from string literals to `char *'. In C, similar warning, except that the conversion is of course not deprecated by the ISO C standard. Index: gcc/c-opts.c =================================================================== --- gcc/c-opts.c (revision 130605) +++ gcc/c-opts.c (working copy) @@ -405,6 +405,7 @@ warn_address = value; warn_strict_overflow = value; warn_array_bounds = value; + warn_volatile_register_var = value; /* Only warn about unknown pragmas that are not in system headers. */ Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 130605) +++ gcc/doc/invoke.texi (working copy) @@ -2656,6 +2656,7 @@ -Wunused-label @gol -Wunused-value @gol -Wunused-variable @gol +-Wvolatile-register-var @gol } Note that some warning flags are not implied by @option{-Wall}. Some of @@ -3902,7 +3903,8 @@ @opindex Wno-volatile-register-var Warn if a register variable is declared volatile. The volatile modifier does not inhibit all optimizations that may eliminate reads -and/or writes to register variables. +and/or writes to register variables. This warning is enabled by +@option{-Wall}. @item -Wdisabled-optimization @opindex Wdisabled-optimization
Subject: Bug 34351 Author: manu Date: Tue Feb 26 14:04:09 2008 New Revision: 132675 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=132675 Log: 2008-02-26 Manuel Lopez-Ibanez <manu@gcc.gnu.org> PR 34351 * doc/invoke.texi (-Wall): Add -Wvolatile-register-var. * c-opts.c (c_common_handle_option): Wall enables Wvolatile-register-var. * common.opt: Move Wvolatile-register-var to... * c.opt: ...here. testsuite/ * gcc.dg/pr34351.c: New. Added: trunk/gcc/testsuite/gcc.dg/pr34351.c Modified: trunk/gcc/ChangeLog trunk/gcc/c-opts.c trunk/gcc/c.opt trunk/gcc/common.opt trunk/gcc/doc/invoke.texi trunk/gcc/testsuite/ChangeLog
Fixed in 4.4.