diff --git a/libcxx/include/__memory/pointer_traits.h b/libcxx/include/__memory/pointer_traits.h --- a/libcxx/include/__memory/pointer_traits.h +++ b/libcxx/include/__memory/pointer_traits.h @@ -11,6 +11,7 @@ #define _LIBCPP___MEMORY_POINTER_TRAITS_H #include <__config> +#include #include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/libcxx/utils/ci/run-buildbot b/libcxx/utils/ci/run-buildbot --- a/libcxx/utils/ci/run-buildbot +++ b/libcxx/utils/ci/run-buildbot @@ -134,14 +134,19 @@ ;; check-generated-output) clean - echo "+++ Checking the output of the generated scripts" + echo "+++ Checking the output of the generator scripts" mkdir -p ${BUILD_DIR} + # Reject patches that introduce non-ASCII characters or hard tabs. + ! grep -r '[^ -~]' libcxx/include/ + # Reject patches that don't update the generated output correctly. python3 libcxx/utils/generate_feature_test_macro_components.py python3 libcxx/utils/generate_header_inclusion_tests.py python3 libcxx/utils/generate_header_tests.py git diff | tee ${BUILD_DIR}/generated_output.patch # Check if the diffs are empty, fail otherwise. ! grep -q '^--- a' ${BUILD_DIR}/generated_output.patch + # Check that no dependency cycles have been introduced. + python3 libcxx/utils/graph_header_deps.py >/dev/null ;; generic-cxx03) export CC=clang diff --git a/libcxx/utils/graph_header_deps.py b/libcxx/utils/graph_header_deps.py --- a/libcxx/utils/graph_header_deps.py +++ b/libcxx/utils/graph_header_deps.py @@ -10,6 +10,7 @@ import argparse import os import re +import sys def is_config_header(h): @@ -60,15 +61,19 @@ local_includes = [] system_includes = [] linecount = 0 - with open(fname, 'r') as f: - for line in f.readlines(): - linecount += 1 - m = re.match(r'\s*#\s*include\s+"([^"]*)"', line) - if m is not None: - local_includes.append(m.group(1)) - m = re.match(r'\s*#\s*include\s+<([^>]*)>', line) - if m is not None: - system_includes.append(m.group(1)) + with open(fname, 'r', encoding='ascii') as f: + try: + for line in f.readlines(): + linecount += 1 + m = re.match(r'\s*#\s*include\s+"([^"]*)"', line) + if m is not None: + local_includes.append(m.group(1)) + m = re.match(r'\s*#\s*include\s+<([^>]*)>', line) + if m is not None: + system_includes.append(m.group(1)) + except UnicodeDecodeError as e: + sys.stderr.write('Non-ASCII detected in %s\n' % fname) + raise fully_qualified_includes = [ locate_header_file(h, options.search_dirs) @@ -204,7 +209,7 @@ for fname, entry in graph.items(): for h in entry.includes: if transitively_includes(graph, h, fname): - print('Cycle detected between %s and %s' % (fname, h)) + sys.stderr.write('Cycle detected between %s and %s\n' % (fname, h)) no_cycles_detected = False assert no_cycles_detected