Thread: Compiler warning in costsize.c
Hi all, In builds where USE_ASSERT_CHECKING is not enabled, costsize.c can generate warnings. Here is for example with MSVC: src/backend/optimizer/path/costsize.c(4520): warning C4101: 'rte' : unreferen ced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] src/backend/optimizer/path/costsize.c(4640): warning C4101: 'rte' : unreferen ced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] a9c074ba7 has done an effort, but a bit more is needed as the attached. Thanks, -- Michael
Attachment
On 4 April 2017 at 16:22, Michael Paquier <michael.paquier@gmail.com> wrote: > Hi all, > > In builds where USE_ASSERT_CHECKING is not enabled, costsize.c can > generate warnings. Here is for example with MSVC: > src/backend/optimizer/path/costsize.c(4520): warning C4101: 'rte' : unreferen > ced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] > src/backend/optimizer/path/costsize.c(4640): warning C4101: 'rte' : unreferen > ced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] > > a9c074ba7 has done an effort, but a bit more is needed as the attached. Thanks for writing the patch. I wondering if it would be worth simplifying it a little to get rid of the double #ifdefs, as per attached. -- David Rowley http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
Attachment
On Tue, Apr 4, 2017 at 7:03 PM, David Rowley <david.rowley@2ndquadrant.com> wrote: > On 4 April 2017 at 16:22, Michael Paquier <michael.paquier@gmail.com> wrote: >> Hi all, >> >> In builds where USE_ASSERT_CHECKING is not enabled, costsize.c can >> generate warnings. Here is for example with MSVC: >> src/backend/optimizer/path/costsize.c(4520): warning C4101: 'rte' : unreferen >> ced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] >> src/backend/optimizer/path/costsize.c(4640): warning C4101: 'rte' : unreferen >> ced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] >> >> a9c074ba7 has done an effort, but a bit more is needed as the attached. > > Thanks for writing the patch. > > I wondering if it would be worth simplifying it a little to get rid of > the double #ifdefs, as per attached. Yes, that would be fine as well. -- Michael
Michael Paquier <michael.paquier@gmail.com> writes: > In builds where USE_ASSERT_CHECKING is not enabled, costsize.c can > generate warnings. Here is for example with MSVC: > src/backend/optimizer/path/costsize.c(4520): warning C4101: 'rte' : unreferenced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] > src/backend/optimizer/path/costsize.c(4640): warning C4101: 'rte' : unreferenced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] > a9c074ba7 has done an effort, but a bit more is needed as the attached. That doesn't look right at all: +#ifdef USE_ASSERT_CHECKING RangeTblEntry *rte PG_USED_FOR_ASSERTS_ONLY; +#endif The entire point of the PG_USED_FOR_ASSERTS_ONLY annotation is to suppress this type of warning without a need for an explicit #ifdef like that one. We should either fix PG_USED_FOR_ASSERTS_ONLY to work on MSVC as well, or decide that we don't care about suppressing such warnings on MSVC, or give up on PG_USED_FOR_ASSERTS_ONLY and remove it everywhere in favor of plain #ifdefs. (I'm personally not that much in love with PG_USED_FOR_ASSERTS_ONLY, because it tends to confuse pgindent.) regards, tom lane
On Wed, Apr 5, 2017 at 2:54 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > Michael Paquier <michael.paquier@gmail.com> writes: >> In builds where USE_ASSERT_CHECKING is not enabled, costsize.c can >> generate warnings. Here is for example with MSVC: >> src/backend/optimizer/path/costsize.c(4520): warning C4101: 'rte' : unreferenced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] >> src/backend/optimizer/path/costsize.c(4640): warning C4101: 'rte' : unreferenced local variable [C:\Users\ioltas\git\postgres\postgres.vcxproj] > >> a9c074ba7 has done an effort, but a bit more is needed as the attached. > > That doesn't look right at all: > > +#ifdef USE_ASSERT_CHECKING > RangeTblEntry *rte PG_USED_FOR_ASSERTS_ONLY; > +#endif > > The entire point of the PG_USED_FOR_ASSERTS_ONLY annotation is to suppress > this type of warning without a need for an explicit #ifdef like that one. > > We should either fix PG_USED_FOR_ASSERTS_ONLY to work on MSVC as well, > or decide that we don't care about suppressing such warnings on MSVC, > or give up on PG_USED_FOR_ASSERTS_ONLY and remove it everywhere in > favor of plain #ifdefs. Visual does not have any equivalent of __attribute__((unused))... And visual does not have an equivalent after looking around. A trick that I can think of would be to change PG_USED_FOR_ASSERTS_ONLY to be roughly a macro like that: #if defined(__GNUC__) #define PG_ASSERT_ONLY(x) ASSERT_ONLY_ ## x __attribute__((unused)) #else #define PG_ASSERT_ONLY(x) ((void) x) #endif But that's ugly... > (I'm personally not that much in love with PG_USED_FOR_ASSERTS_ONLY, > because it tends to confuse pgindent.) I would be incline to just do that, any other solution I can think of is uglier than that. -- Michael