c-family: Macro support in -Wmisleading-indentation [PR80076]
authorPatrick Palka <ppalka@redhat.com>
Thu, 17 Sep 2020 18:27:22 +0000 (14:27 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 17 Sep 2020 18:27:22 +0000 (14:27 -0400)
commit4839de55e2c98619f4919254abb87e2f393aaead
tree6b191cd26456d813b29ea6204c1730004879fa5d
parent71e3d1970c00a74be16c0f5a3fcaced359077135
c-family: Macro support in -Wmisleading-indentation [PR80076]

Currently the -Wmisleading-indentation warning doesn't do any analysis
when the guarded statement or the statement after it is produced by a
macro.  This means we warn for:

  if (flag)
    foo ();
    bar ();

but not for:

  #define BAR bar
  if (flag)
    foo ();
    BAR ();

This patch extends the -Wmisleading-indentation implementation to
support analyzing such statements and their tokens.  This is done in the
"natural" way by resolving the location of each of the three tokens to
the token's macro expansion point.  (Additionally, if the tokens all
resolve to the same macro expansion point then we instead use their
locations within the macro definition.)  When these resolved locations
are all different, then we can proceed with applying the warning
heuristics to them as if no macros were involved.

gcc/c-family/ChangeLog:

PR c/80076
* c-indentation.c (should_warn_for_misleading_indentation): Move
declarations of local variables closer to their first use.
Handle virtual token locations by resolving them to their
respective macro expansion points.  If all three tokens are
produced from the same macro expansion, then instead use their
loci within the macro definition.

gcc/objc/ChangeLog:

PR c/80076
* objc-gnu-runtime-abi-01.c
(gnu_runtime_abi_01_get_class_super_ref): Reduce indentation of
misleadingly indented return statements.
* objc-next-runtime-abi-01.c
(next_runtime_abi_01_get_class_super_ref): Likewise.

gcc/ChangeLog:

PR c/80076
* gensupport.c (alter_attrs_for_subst_insn) <case SET_ATTR>:
Reduce indentation of misleadingly indented code fragment.
* lra-constraints.c (multi_block_pseudo_p): Likewise.
* sel-sched-ir.c (merge_fences): Likewise.

libcpp/ChangeLog:

PR c/80076
* include/line-map.h (first_map_in_common): Declare.
* line-map.c (first_map_in_common): Remove static.

gcc/testsuite/ChangeLog:

PR c/80076
* c-c++-common/Wmisleading-indentation-5.c: New test.
gcc/c-family/c-indentation.c
gcc/gensupport.c
gcc/lra-constraints.c
gcc/objc/objc-gnu-runtime-abi-01.c
gcc/objc/objc-next-runtime-abi-01.c
gcc/sel-sched-ir.c
gcc/testsuite/c-c++-common/Wmisleading-indentation-5.c [new file with mode: 0644]
libcpp/include/line-map.h
libcpp/line-map.c