From a06bf8506fdfc0aff1098831bfc49bff4436399d Mon Sep 17 00:00:00 2001 From: tzik Date: Thu, 15 Nov 2018 20:37:35 +0900 Subject: [PATCH] Add a presubmit check for absl/memory/memory.h inclusion This adds a presubmit check that warns missing memory.h inclusion when a source file use absl::make_unique. That header tends to be included transitively on pre-C++17 mode, but doesn't on C++17 mode. Bug: chromium:752720 Change-Id: I235287f4f7407d48bfad35da86da47bc602f03ce Reviewed-on: https://webrtc-review.googlesource.com/c/111040 Commit-Queue: Taiju Tsuiki Reviewed-by: Karl Wiberg Reviewed-by: Mirko Bonadei Cr-Commit-Position: refs/heads/master@{#25655} --- PRESUBMIT.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/PRESUBMIT.py b/PRESUBMIT.py index 0bcf99777b..34b5adf777 100755 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py @@ -864,6 +864,8 @@ def CommonChecks(input_api, output_api): input_api, output_api, non_third_party_sources)) results.extend(CheckAddedDepsHaveTargetApprovals(input_api, output_api)) results.extend(CheckApiDepsFileIsUpToDate(input_api, output_api)) + results.extend(CheckAbslMemoryInclude( + input_api, output_api, non_third_party_sources)) return results @@ -920,6 +922,30 @@ def CheckApiDepsFileIsUpToDate(input_api, output_api): return results +def CheckAbslMemoryInclude(input_api, output_api, source_file_filter): + pattern = input_api.re.compile( + r'^#include\s*"absl/memory/memory.h"', input_api.re.MULTILINE) + file_filter = lambda f: (f.LocalPath().endswith(('.cc', '.h')) + and source_file_filter(f)) + + files = [] + for f in input_api.AffectedFiles( + include_deletes=False, file_filter=file_filter): + contents = input_api.ReadFile(f) + if pattern.search(contents): + continue + for _, line in f.ChangedContents(): + if 'absl::make_unique' in line: + files.append(f) + break + + if len(files): + return [output_api.PresubmitError( + 'Please include "absl/memory/memory.h" header for' + ' absl::make_unique.\nThis header may or may not be included' + ' transitively depends on the C++ standard version.', + files)] + return [] def CheckChangeOnUpload(input_api, output_api): results = []