blob: efb33a6a25a559c3e12ce9a710e8cbb809fdcc57 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2020 The Verible Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
# Test for things that we don't want to introduce accidentally.
##
EXIT_CODE=0
# std::string_view has different semantics on Windows compared to gcc or clang
# c++ libraries: the iterators don't return const char*, but a wrapping object.
#
# There are a few assumptions in the code that assumes const char*, however.
#
# So, we need to use absl::string_view that comes with the same implementation
# everywhere.
find . -name "*.h" -o -name "*.cc" | xargs grep -n "std::string_view"
if [ $? -eq 0 ]; then
echo "::error:: use absl::string_view instead of std::string_view"
echo
EXIT_CODE=1
fi
# The status macros pollute the global namespace with names that might
# clash in other environments that include these headers and have that name
# defined differently.
#
# So let's make sure to only use them in our compilation units, not headers.
# (Not a super-strong potential problem, so we might consider removing
# this test, but if we need RETURN_IF_ERROR() in a header file, maybe it
# is a good idea to move an implementation to a *.cc file anyway)
#
# TODO(hzeller): Arguably this might be good for common/util/logging.h as well.
find . -name "*.h" | xargs grep -n '#include "common/util/status_macros.h"'
if [ $? -eq 0 ]; then
echo "::error:: using status_macros.h in a header pollutes global namespace."
echo
EXIT_CODE=1
fi
# Don't accidentally use anything from the verilog namespace in the common
# verible namespace to make sure common stays independent.
# Use of that namespace in a comment is ok, or if waived with // NOLINT
find common -name "*.h" -o -name "*.cc" | xargs grep "verilog::" \
| egrep -v "(//.*verilog::|// NOLINT)"
if [ $? -eq 0 ]; then
echo "::error:: use of the verilog::-namespace inside common/"
echo
EXIT_CODE=1
fi
# Always use fully qualified include paths.
# Exclude zlib.h, which is the only allowed header.
find common verilog -name "*.h" -o -name "*.cc" | \
xargs egrep -n '#include "[^/]*"' | grep -v zlib.h
if [ $? -eq 0 ]; then
echo "::error:: always use a fully qualified name for #includes"
echo
EXIT_CODE=1
fi
exit "${EXIT_CODE}"