From c9d946d07ae9a270042bcfef2bccfa09de6bddd9 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 26 May 2014 12:57:44 +0930 Subject: [PATCH] tools/ccanlint: detect more unmentioned dependencies. Signed-off-by: Rusty Russell --- tools/ccanlint/tests/depends_accurate.c | 9 ++++----- tools/ccanlint/tests/headers_idempotent.c | 11 ++++++++--- tools/manifest.c | 2 ++ tools/manifest.h | 3 +++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/ccanlint/tests/depends_accurate.c b/tools/ccanlint/tests/depends_accurate.c index d7082fac..a0fe6f32 100644 --- a/tools/ccanlint/tests/depends_accurate.c +++ b/tools/ccanlint/tests/depends_accurate.c @@ -53,10 +53,9 @@ static bool check_dep_includes(struct manifest *m, if (has_dep(m, deps, used, mod)) continue; - /* FIXME: we can't be sure about - * conditional includes, so don't - * complain. */ - if (!li[i].cond) { + /* FIXME: we can't be sure about conditional includes, + * so don't complain (handle common case of idempotent wrap) */ + if (!li[i].cond || li[i].cond == f->idempotent_cond) { score_file_error(score, f, i+1, "%s not listed in _info", mod); ok = false; @@ -138,7 +137,7 @@ struct ccanlint depends_accurate = { .key = "depends_accurate", .name = "Module's CCAN dependencies are the only CCAN files #included", .check = check_depends_accurate, - .needs = "depends_exist test_depends_exist" + .needs = "depends_exist test_depends_exist headers_idempotent" }; REGISTER_TEST(depends_accurate); diff --git a/tools/ccanlint/tests/headers_idempotent.c b/tools/ccanlint/tests/headers_idempotent.c index 55fa9974..1b2916bd 100644 --- a/tools/ccanlint/tests/headers_idempotent.c +++ b/tools/ccanlint/tests/headers_idempotent.c @@ -125,9 +125,10 @@ static void check_idem(struct ccan_file *f, struct score *score) if (!f->lines[i]) return; - /* We expect a condition on this line. */ + /* We expect a condition around this line. */ if (!line_info[i].cond) { - score_file_error(score, f, i+1, "Expected #ifndef"); + score_file_error(score, f, first_preproc_line+1, + "Expected #ifndef"); return; } @@ -136,7 +137,8 @@ static void check_idem(struct ccan_file *f, struct score *score) /* We expect the condition to be ! IFDEF . */ if (line_info[i].cond->type != PP_COND_IFDEF || !line_info[i].cond->inverse) { - score_file_error(score, f, i+1, "Expected #ifndef"); + score_file_error(score, f, first_preproc_line+1, + "Expected #ifndef"); return; } @@ -157,6 +159,9 @@ static void check_idem(struct ccan_file *f, struct score *score) return; } + /* Record this for use in depends_accurate */ + f->idempotent_cond = line_info[i].cond; + /* Rest of code should all be covered by that conditional. */ for (i++; f->lines[i]; i++) { unsigned int val = 0; diff --git a/tools/manifest.c b/tools/manifest.c index 762550ea..fe3e4680 100644 --- a/tools/manifest.c +++ b/tools/manifest.c @@ -78,6 +78,8 @@ struct ccan_file *new_ccan_file(const void *ctx, const char *dir, f->fullname = path_join(f, dir, f->name); f->contents = NULL; f->simplified = NULL; + f->idempotent_cond = NULL; + return f; } diff --git a/tools/manifest.h b/tools/manifest.h index d2de6437..d11dbec8 100644 --- a/tools/manifest.h +++ b/tools/manifest.h @@ -80,6 +80,9 @@ struct ccan_file { /* Simplified stream (lowercase letters and single spaces) */ char *simplified; + + /* Condition for idempotent wrapper (filled by headers_idempotent) */ + struct pp_conditions *idempotent_cond; }; /* A new ccan_file, with the given dir and name (either can be take()). */ -- 2.39.2