https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99353

            Bug ID: 99353
           Summary: warn_unused attribute does not seem to work for static
                    variables
           Product: gcc
           Version: 9.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: robert-gcc at debian dot org
  Target Milestone: ---

According to
https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/C_002b_002b-Attributes.html#C_002b_002b-Attributes,
the 'warn_unused' attribute  'informs the compiler that variables of this type
should be warned about if they appear to be unused, just like variables of
fundamental types'. 

However this does not seem to work in case of static variables - please see the
program pasted below, that does not use any of declared variables, but "g++
-Wall  -Wextra -O2 -std=c++17" diagnoses mostly local unused variables, as
marked in the comments in the program. 

See https://wandbox.org/permlink/fztgVWxYX8iJ5uYS for a demo. I've tried a few
different versions of g++ there, including the latest one, but with the same
result.

--- Program contents:  ---

struct  __attribute__ ((warn_unused)) A 
{
};

struct  __attribute__ ((warn_unused)) B 
{
  B() {};
};

struct  __attribute__ ((warn_unused)) C 
{
  ~C() {};
};


static int i1 = 0;        //  warning: 'i1' defined but not used 
static const int i2 = 0;  // NO WARNING 

static A a1;             // warning: 'a1' defined but not used 
static const A a2;       // NO WARNING 

static B b1;             // NO WARNING  
static const B b2;       // NO WARNING 

static C c1;             // NO WARNING 
static const C c2;       // NO WARNING 


int main()
{

    A a3;             // warning: unused variable 'a3' 
    const A a4;       // warning: unused variable 'a4'
    B b3;             // warning: unused variable 'b3
    const B b4;       // warning: unused variable 'b4'
    C c3;             // warning: unused variable 'c3'
    const C c4;       // warning: unused variable 'c4'

    static A a5;       // warning: unused variable 'a5',  warning: 'a5' defined
but not used
    static const A a6; // warning: unused variable 'a6'
    static B b5;       // warning: unused variable 'b5'
    static const B b6; // warning: unused variable 'b6'
    static C c5;       // NO WARNING 
    static const C c6; // NO WARNING 


    return 0;
}

Reply via email to