| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> | 
|---|---|
| To: | Thomas Munro <thomas(dot)munro(at)gmail(dot)com> | 
| Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> | 
| Subject: | Re: Tree-walker callbacks vs -Wdeprecated-non-prototype | 
| Date: | 2022-09-19 18:10:12 | 
| Message-ID: | 508012.1663611012@sss.pgh.pa.us | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
Here's a second-generation patch that fixes the warnings by inserting
casts into a layer of macro wrappers.  I had supposed that this would
cause us to lose all detection of wrongly-chosen walker functions,
so I was very pleased to see this when applying it to yesterday's HEAD:
execProcnode.c:792:2: warning: cast from 'bool (*)(PlanState *)' (aka 'bool (*)(struct PlanState *)') to 'planstate_tree_walker_callback' (aka 'bool (*)(struct PlanState *, void *)') converts to incompatible function type [-Wcast-function-type]
        planstate_tree_walker(node, ExecShutdownNode, NULL);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../../src/include/nodes/nodeFuncs.h:180:33: note: expanded from macro 'planstate_tree_walker'
        planstate_tree_walker_impl(ps, (planstate_tree_walker_callback) (w), c)
                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
So we've successfully suppressed the pedantic -Wdeprecated-non-prototype
warnings, and we have activated the actually-useful -Wcast-function-type
warnings, which seem to do exactly what we want in this context:
'-Wcast-function-type'
     Warn when a function pointer is cast to an incompatible function
     pointer.  In a cast involving function types with a variable
     argument list only the types of initial arguments that are provided
     are considered.  Any parameter of pointer-type matches any other
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     pointer-type.  Any benign differences in integral types are
     ^^^^^^^^^^^^
     ignored, like 'int' vs.  'long' on ILP32 targets.  Likewise type
     qualifiers are ignored.  The function type 'void (*) (void)' is
     special and matches everything, which can be used to suppress this
     warning.  In a cast involving pointer to member types this warning
     warns whenever the type cast is changing the pointer to member
     type.  This warning is enabled by '-Wextra'.
(That verbiage is from the gcc manual; clang seems to act the same
except that -Wcast-function-type is selected by -Wall, or perhaps is
even on by default.)
So I'm pretty pleased with this formulation: no caller changes are
needed, and it does exactly what we want warning-wise.
regards, tom lane
| Attachment | Content-Type | Size | 
|---|---|---|
| clean-up-tree-walker-warnings-2.patch | text/x-diff | 48.0 KB | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Robert Haas | 2022-09-19 18:11:40 | Re: Tree-walker callbacks vs -Wdeprecated-non-prototype | 
| Previous Message | Robert Haas | 2022-09-19 18:02:27 | Re: walmethods.c/h are doing some strange things |