* Added c++17 test configurations for clang5.0 and clang6.0

* Fix #739 correct cppcorecheck warnings for clang-cl

* Add clang-cl  configurations

* Corrections Appveyor;
Temporarily disable msvc compilation for faster testing (#741)

* Add path to clang-cl.exe (#741)

* Escape backslash in path (#741)

* Update vcpkg (#741)

* Check vcpkg version; try without building vcpkg; use latest clang-cl from path (#741)

* Fix blocks in ps script (#741)

* Try accessing APPVEYOR_BUILD_FOLDER variable (#471)

* Update span size() bug confirmation test for GCC 6.5 (#741)

* MSVC flags to Clang-cl; disable c++98-compat and undefined macro warnings (#741)

* Suppress clang warning on tests (missing-prototypes) (#741)

* Fix clang warning -Wnewline-eof (#741)

* Fix clang warning -Wdouble-promotion (#741)

* Set linker explicitly

* Clean condition statement

* For Clang, fallback to the AppVeyor installed version of CMake

* Fix clang warning -Wmissing-variable-declarations

* Fallback to the MSVC linker until vcpkg has been updated

* Revert "Fallback to the MSVC linker until vcpkg has been updated"

This reverts commit 7263f3289e.

* Fix clang warning -Wunused-member-function

* Fix clang warning -Wmissing-noreturn

* Fix clang warning -Winvalid-noreturn on Windows

* Add macro block end comment on large #if blocks

* Workaround: fallback to mscv link.exe

* Workaround: get msvc paths into PowerShell through intermediate file

* Workaround: fix, remove "PATH=" from text

* Workaround: try with full-path; and return user PATH

* Workaround: fix, escape backslashes

* Revert all since "Workaround: fallback to mscv link.exe" did not work on AppVeyor

This reverts the commits:
bda3d6a428
97062933ac
0f4fb04bac
1b0c19afd1
a5739ea5f0

* Suppress output of git pull; remove vcpkg from cache

* Re-enable AppVeyor builds for all platforms

* Correct typo

Co-Authored-By: Farwaykorse <Farwaykorse@users.noreply.github.com>

* Add Clang-cl 7.0.0 to the supported platforms

* Revert "Fix clang warning -Wunused-member-function"

This reverts commit 6fe1a42035.

* Fix or locally suppress clang warning -Wunused-member-function

* format touched code and correct comment

* git pull --quiet

* fix logic error in workaround

* fix missing bracket

* Suppress output of mkdir

* Replace MSBuild with Ninja

* Suppress output of 7z

* Add architecture flags for Clang

* Drop workaround for lld-link

* 7-zip Overwrite and Alternative output suppression without suppressing errors

Replaces 3c1c0794dd

* AppVeyor setup and CMake before build

* reorder compiler configuration

* remove unnecessary

* remove -fno-strict-aliasing

* remove -Wsign-conversion, since before v4.0 part of -Wconversion

* -Wctor-dtor-privacy is GCC only

* remove -Woverloaded-virtual part of -Wmost, part of -Wall

* add -Wmissing-noreturn

* remove the pragmas for -Wunused-member-function

* Re-add MSBuild generator on AppVeyor

* Print CMake commands

* Add MSBuild toolset selection

* Separate Architecture setting

* clang-cl: add -Weverything

* clang-cl -Wno-c++98-compat

* clang-cl -Wno-c++98-compat-pedantic

* clang-cl -Wno-missing-prototypes

* clang-cl C++14 -Wno-unused-member-function

* clang-cl -Wundef __GNUC__

* clang++: add -Weverything

* clang++ -Wno-c++98-compat

* clang++ -Wno-c++98-compat-pedantic

* clang++ -Wno-missing-prototypes

* clang++ -Wno-weak-vtables

* clang++ C++14 -Wno-unused-member-function

* clang++ fix -Wundef _MSC_VER

* clang++ -Wno-padded

* clang++ solve -Wdeprecated

* Add AppleClang compiler target
Since CMake v3.0 use of Clang for both is deprecated

* clang++ v5.0 C++17 -Wno-undefined-func-template

* Add VS2015 + LLVM/clang-cl to AppVeyor

* Do not disable constexpr when compiling with clang-cl on Windows

* Clean-up clang-only warnings (now under -Weverything)

* Revert "Fix clang warning -Winvalid-noreturn on Windows"

This reverts commit 2238c4760e.

* Suppress -Winvalid-noreturn for the MS STL noexception workaround

* CMake: put preprocessor definition in target_compile_definitions

* Solve compiler warning C4668: __GNUC__ not defined
This commit is contained in:
Anna Gringauze 2019-01-15 10:27:34 -08:00 committed by GitHub
parent 6eeed739f1
commit 6418b5f4de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 213 additions and 106 deletions

View File

@ -27,6 +27,7 @@ The test suite that exercises GSL has been built and passes successfully on the
* Windows using Visual Studio 2015 * Windows using Visual Studio 2015
* Windows using Visual Studio 2017 * Windows using Visual Studio 2017
* Windows using Clang/LLVM 3.6 * Windows using Clang/LLVM 3.6
* Windows using Clang/LLVM 7.0.0
* Windows using GCC 5.1 * Windows using GCC 5.1
* Windows using Intel C++ Compiler 18.0 * Windows using Intel C++ Compiler 18.0
* GNU/Linux using Clang/LLVM 3.6 * GNU/Linux using Clang/LLVM 3.6

View File

@ -13,44 +13,108 @@ image:
- Visual Studio 2017 - Visual Studio 2017
environment: environment:
NINJA_TAG: v1.8.2
NINJA_SHA512: 9B9CE248240665FCD6404B989F3B3C27ED9682838225E6DC9B67B551774F251E4FF8A207504F941E7C811E7A8BE1945E7BCB94472A335EF15E23A0200A32E6D5
NINJA_PATH: C:\Tools\ninja\ninja-%NINJA_TAG%
VCVAR2015: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat'
VCVAR2017: 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat'
matrix: matrix:
- GSL_CXX_STANDARD: 14 - GSL_CXX_STANDARD: 14
USE_TOOLSET: MSVC
USE_GENERATOR: MSBuild
- GSL_CXX_STANDARD: 17 - GSL_CXX_STANDARD: 17
USE_TOOLSET: MSVC
USE_GENERATOR: MSBuild
- GSL_CXX_STANDARD: 14
USE_TOOLSET: LLVM
USE_GENERATOR: Ninja
- GSL_CXX_STANDARD: 17
USE_TOOLSET: LLVM
USE_GENERATOR: Ninja
matrix: matrix:
exclude: exclude:
- image: Visual Studio 2015 - image: Visual Studio 2015
GSL_CXX_STANDARD: 17 GSL_CXX_STANDARD: 17
- image: Visual Studio 2015
USE_TOOLSET: LLVM
USE_GENERATOR: MSBuild
cache: cache:
- C:\cmake-3.8.0-win32-x86 - C:\cmake-3.8.0-win32-x86
- C:\Tools\ninja
install: install:
- ps: | - ps: |
if (![IO.File]::Exists("C:\cmake-3.8.0-win32-x86\bin\cmake.exe")) { if (![IO.File]::Exists("$env:NINJA_PATH\ninja.exe")) {
Start-FileDownload 'https://cmake.org/files/v3.8/cmake-3.8.0-win32-x86.zip' Start-FileDownload `
7z x -y cmake-3.8.0-win32-x86.zip -oC:\ "https://github.com/ninja-build/ninja/releases/download/$env:NINJA_TAG/ninja-win.zip"
$hash = (Get-FileHash ninja-win.zip -Algorithm SHA512).Hash
if ($env:NINJA_SHA512 -eq $hash) {
7z e -y -bso0 ninja-win.zip -o"$env:NINJA_PATH"
} else { Write-Warning "Ninja download hash changed!"; Write-Output "$hash" }
}
if ([IO.File]::Exists("$env:NINJA_PATH\ninja.exe")) {
$env:PATH = "$env:NINJA_PATH;$env:PATH"
} else { Write-Warning "Failed to find ninja.exe in expected location." }
if ($env:USE_TOOLSET -ne "LLVM") {
if (![IO.File]::Exists("C:\cmake-3.8.0-win32-x86\bin\cmake.exe")) {
Start-FileDownload 'https://cmake.org/files/v3.8/cmake-3.8.0-win32-x86.zip'
7z x -y -bso0 cmake-3.8.0-win32-x86.zip -oC:\
}
$env:PATH="C:\cmake-3.8.0-win32-x86\bin;$env:PATH"
} }
$env:PATH="C:\cmake-3.8.0-win32-x86\bin;$env:PATH"
before_build: before_build:
- ps: | - ps: |
mkdir build if ("$env:USE_GENERATOR" -eq "Ninja") {
cd build $GeneratorFlags = '-k 10'
$Architecture = $env:PLATFORM
if ("$env:APPVEYOR_JOB_NAME" -match "Image: Visual Studio 2015") { if ("$env:APPVEYOR_BUILD_WORKER_IMAGE" -eq "Visual Studio 2015") {
$env:generator="Visual Studio 14 2015" $env:VCVARSALL = "`"$env:VCVAR2015`" $Architecture"
} else {
$env:VCVARSALL = "`"$env:VCVAR2017`" $Architecture"
}
$env:CMakeGenFlags = "-G Ninja -DGSL_CXX_STANDARD=$env:GSL_CXX_STANDARD"
} else { } else {
$env:generator="Visual Studio 15 2017" $GeneratorFlags = '/m /v:minimal'
if ("$env:APPVEYOR_BUILD_WORKER_IMAGE" -eq "Visual Studio 2015") {
$Generator = 'Visual Studio 14 2015'
} else {
$Generator = 'Visual Studio 15 2017'
}
if ("$env:PLATFORM" -eq "x86") {
$Architecture = "Win32"
} else {
$Architecture = "x64"
}
if ("$env:USE_TOOLSET" -eq "LLVM") {
$env:CMakeGenFlags = "-G `"$Generator`" -A $Architecture -T llvm -DGSL_CXX_STANDARD=$env:GSL_CXX_STANDARD"
} else {
$env:CMakeGenFlags = "-G `"$Generator`" -A $Architecture -DGSL_CXX_STANDARD=$env:GSL_CXX_STANDARD"
}
} }
if ($env:PLATFORM -eq "x64") { if ("$env:USE_TOOLSET" -eq "LLVM") {
$env:generator="$env:generator Win64" $env:CC = "clang-cl"
$env:CXX = "clang-cl"
if ("$env:PLATFORM" -eq "x86") {
$env:CFLAGS = "-m32";
$env:CXXFLAGS = "-m32";
} else {
$env:CFLAGS = "-m64";
$env:CXXFLAGS = "-m64";
}
} }
echo generator="$env:generator" $env:CMakeBuildFlags = "--config $env:CONFIGURATION -- $GeneratorFlags"
cmake .. -G "$env:generator" -DGSL_CXX_STANDARD="$env:GSL_CXX_STANDARD" - mkdir build
- cd build
- if %USE_GENERATOR%==Ninja (call %VCVARSALL%)
- echo %CMakeGenFlags%
- cmake .. %CMakeGenFlags%
build_script: build_script:
- cmake --build . --config %CONFIGURATION% -- /m /v:minimal - echo %CMakeBuildFlags%
- cmake --build . %CMakeBuildFlags%
test_script: test_script:
- ctest -j2 - ctest -j2

View File

@ -22,17 +22,17 @@
// //
// make suppress attributes parse for some compilers // make suppress attributes parse for some compilers
// Hopefully temporary until suppresion standardization occurs // Hopefully temporary until suppression standardization occurs
// //
#if defined (_MSC_VER)
#define GSL_SUPPRESS(x) [[gsl::suppress(x)]]
#else
#if defined(__clang__) #if defined(__clang__)
#define GSL_SUPPRESS(x) [[gsl::suppress("x")]] #define GSL_SUPPRESS(x) [[gsl::suppress("x")]]
#else #else
#if defined(_MSC_VER)
#define GSL_SUPPRESS(x) [[gsl::suppress(x)]]
#else
#define GSL_SUPPRESS(x) #define GSL_SUPPRESS(x)
#endif // __clang__
#endif // _MSC_VER #endif // _MSC_VER
#endif // __clang__
// //
// Temporary until MSVC STL supports no-exceptions mode. // Temporary until MSVC STL supports no-exceptions mode.
@ -42,6 +42,12 @@
#define GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND #define GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND
#include <intrin.h> #include <intrin.h>
#define RANGE_CHECKS_FAILURE 0 #define RANGE_CHECKS_FAILURE 0
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Winvalid-noreturn"
#endif
#endif #endif
// //
@ -98,7 +104,7 @@ namespace details
#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) #if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND)
typedef void (__cdecl *terminate_handler)(); typedef void (__cdecl *terminate_handler)();
GSL_SUPPRESS(f.6) // NO-FORMAT: attribute GSL_SUPPRESS(f.6) // NO-FORMAT: attribute
[[noreturn]] inline void __cdecl default_terminate_handler() [[noreturn]] inline void __cdecl default_terminate_handler()
{ {
@ -138,7 +144,7 @@ namespace details
throw std::forward<Exception>(exception); throw std::forward<Exception>(exception);
} }
#endif #endif // GSL_TERMINATE_ON_CONTRACT_VIOLATION
} // namespace details } // namespace details
} // namespace gsl } // namespace gsl
@ -159,9 +165,13 @@ namespace details
#define GSL_CONTRACT_CHECK(type, cond) GSL_ASSUME(cond) #define GSL_CONTRACT_CHECK(type, cond) GSL_ASSUME(cond)
#endif #endif // GSL_THROW_ON_CONTRACT_VIOLATION
#define Expects(cond) GSL_CONTRACT_CHECK("Precondition", cond) #define Expects(cond) GSL_CONTRACT_CHECK("Precondition", cond)
#define Ensures(cond) GSL_CONTRACT_CHECK("Postcondition", cond) #define Ensures(cond) GSL_CONTRACT_CHECK("Postcondition", cond)
#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) && defined(__clang__)
#pragma clang diagnostic pop
#endif
#endif // GSL_CONTRACTS_H #endif // GSL_CONTRACTS_H

View File

@ -19,17 +19,17 @@
// //
// make suppress attributes work for some compilers // make suppress attributes work for some compilers
// Hopefully temporary until suppresion standardization occurs // Hopefully temporary until suppression standardization occurs
// //
#if defined(_MSC_VER)
#define GSL_SUPPRESS(x) [[gsl::suppress(x)]]
#else
#if defined(__clang__) #if defined(__clang__)
#define GSL_SUPPRESS(x) [[gsl::suppress("x")]] #define GSL_SUPPRESS(x) [[gsl::suppress("x")]]
#else #else
#if defined(_MSC_VER)
#define GSL_SUPPRESS(x) [[gsl::suppress(x)]]
#else
#define GSL_SUPPRESS(x) #define GSL_SUPPRESS(x)
#endif // __clang__
#endif // _MSC_VER #endif // _MSC_VER
#endif // __clang__
#include <type_traits> #include <type_traits>
@ -79,7 +79,7 @@
#endif // _MSC_VER #endif // _MSC_VER
// Use __may_alias__ attribute on gcc and clang // Use __may_alias__ attribute on gcc and clang
#if defined __clang__ || (__GNUC__ > 5) #if defined __clang__ || (defined(__GNUC__) && __GNUC__ > 5)
#define byte_may_alias __attribute__((__may_alias__)) #define byte_may_alias __attribute__((__may_alias__))
#else // defined __clang__ || defined __GNUC__ #else // defined __clang__ || defined __GNUC__
#define byte_may_alias #define byte_may_alias

View File

@ -26,7 +26,7 @@
#include <type_traits> // for is_signed, integral_constant #include <type_traits> // for is_signed, integral_constant
#include <utility> // for forward #include <utility> // for forward
#if defined(_MSC_VER) #if defined(_MSC_VER) && !defined(__clang__)
#pragma warning(push) #pragma warning(push)
#pragma warning(disable : 4127) // conditional expression is constant #pragma warning(disable : 4127) // conditional expression is constant
@ -161,7 +161,7 @@ constexpr T at(const std::initializer_list<T> cont, const index i)
} // namespace gsl } // namespace gsl
#if defined(_MSC_VER) #if defined(_MSC_VER) && !defined(__clang__)
#if _MSC_VER < 1910 #if _MSC_VER < 1910
#undef constexpr #undef constexpr
#pragma pop_macro("constexpr") #pragma pop_macro("constexpr")

View File

@ -37,7 +37,7 @@
#include <type_traits> // for enable_if_t, remove_cv_t, is_same, is_co... #include <type_traits> // for enable_if_t, remove_cv_t, is_same, is_co...
#include <utility> #include <utility>
#ifdef _MSC_VER #if defined(_MSC_VER) && !defined(__clang__)
// turn off some warnings that are noisy about our Expects statements // turn off some warnings that are noisy about our Expects statements
#pragma warning(push) #pragma warning(push)
@ -62,7 +62,7 @@
// compiletime, so the compiler wouldn't have to warn indiscriminently, but // compiletime, so the compiler wouldn't have to warn indiscriminently, but
// could check if the source value actually doesn't fit into the target type // could check if the source value actually doesn't fit into the target type
// and only warn in those cases. // and only warn in those cases.
#if __GNUC__ > 6 #if defined(__GNUC__) && __GNUC__ > 6
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsign-conversion" #pragma GCC diagnostic ignored "-Wsign-conversion"
#endif #endif
@ -596,7 +596,6 @@ public:
using sliced_type = static_bounds<RestRanges...>; using sliced_type = static_bounds<RestRanges...>;
using mapping_type = contiguous_mapping_tag; using mapping_type = contiguous_mapping_tag;
constexpr static_bounds(const static_bounds&) noexcept = default;
constexpr static_bounds() /*noexcept*/ = default; constexpr static_bounds() /*noexcept*/ = default;
template <typename SourceType, typename TargetType, std::size_t Rank> template <typename SourceType, typename TargetType, std::size_t Rank>
@ -1887,6 +1886,8 @@ public:
auto d = narrow_cast<size_type>(sizeof(OtherValueType) / sizeof(value_type)); auto d = narrow_cast<size_type>(sizeof(OtherValueType) / sizeof(value_type));
const size_type size = this->bounds().total_size() / d; const size_type size = this->bounds().total_size() / d;
GSL_SUPPRESS(type.3) // NO-FORMAT: attribute
return {const_cast<OtherValueType*>(reinterpret_cast<const OtherValueType*>(this->data())), return {const_cast<OtherValueType*>(reinterpret_cast<const OtherValueType*>(this->data())),
size, size,
bounds_type{resize_extent(this->bounds().index_bounds(), d), bounds_type{resize_extent(this->bounds().index_bounds(), d),
@ -2274,7 +2275,7 @@ general_span_iterator<Span> operator+(typename general_span_iterator<Span>::diff
} // namespace gsl } // namespace gsl
#ifdef _MSC_VER #if defined(_MSC_VER) && !defined(__clang__)
#if _MSC_VER < 1910 #if _MSC_VER < 1910
#undef constexpr #undef constexpr
@ -2285,7 +2286,7 @@ general_span_iterator<Span> operator+(typename general_span_iterator<Span>::diff
#endif // _MSC_VER #endif // _MSC_VER
#if __GNUC__ > 6 #if defined(__GNUC__) && __GNUC__ > 6
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif // __GNUC__ > 6 #endif // __GNUC__ > 6

View File

@ -25,7 +25,7 @@
#include <system_error> // for hash #include <system_error> // for hash
#include <type_traits> // for enable_if_t, is_convertible, is_assignable #include <type_traits> // for enable_if_t, is_convertible, is_assignable
#if defined(_MSC_VER) && _MSC_VER < 1910 #if defined(_MSC_VER) && _MSC_VER < 1910 && !defined(__clang__)
#pragma push_macro("constexpr") #pragma push_macro("constexpr")
#define constexpr /*constexpr*/ #define constexpr /*constexpr*/
@ -283,10 +283,12 @@ struct hash<gsl::strict_not_null<T>>
}; };
} // namespace std } // namespace std
#if defined(_MSC_VER) && _MSC_VER < 1910
#if defined(_MSC_VER) && _MSC_VER < 1910 && !defined(__clang__)
#undef constexpr #undef constexpr
#pragma pop_macro("constexpr") #pragma pop_macro("constexpr")
#endif // defined(_MSC_VER) && _MSC_VER < 1910 #endif // defined(_MSC_VER) && _MSC_VER < 1910 && !defined(__clang__)
#endif // GSL_POINTERS_H #endif // GSL_POINTERS_H

View File

@ -31,7 +31,7 @@
#include <utility> #include <utility>
#include <memory> // for std::addressof #include <memory> // for std::addressof
#ifdef _MSC_VER #if defined(_MSC_VER) && !defined(__clang__)
#pragma warning(push) #pragma warning(push)
// turn off some warnings that are noisy about our Expects statements // turn off some warnings that are noisy about our Expects statements
@ -61,7 +61,7 @@
// compiletime, so the compiler wouldn't have to warn indiscriminently, but // compiletime, so the compiler wouldn't have to warn indiscriminently, but
// could check if the source value actually doesn't fit into the target type // could check if the source value actually doesn't fit into the target type
// and only warn in those cases. // and only warn in those cases.
#if __GNUC__ > 6 #if defined(__GNUC__) && __GNUC__ > 6
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsign-conversion" #pragma GCC diagnostic ignored "-Wsign-conversion"
#endif #endif
@ -776,7 +776,7 @@ constexpr ElementType& at(span<ElementType, Extent> s, index i)
} // namespace gsl } // namespace gsl
#ifdef _MSC_VER #if defined(_MSC_VER) && !defined(__clang__)
#if _MSC_VER < 1910 #if _MSC_VER < 1910
#undef constexpr #undef constexpr
#pragma pop_macro("constexpr") #pragma pop_macro("constexpr")
@ -786,7 +786,7 @@ constexpr ElementType& at(span<ElementType, Extent> s, index i)
#pragma warning(pop) #pragma warning(pop)
#endif // _MSC_VER #endif // _MSC_VER
#if __GNUC__ > 6 #if defined(__GNUC__) && __GNUC__ > 6
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif // __GNUC__ > 6 #endif // __GNUC__ > 6

View File

@ -30,7 +30,7 @@
#include <string> // for basic_string, allocator, char_traits #include <string> // for basic_string, allocator, char_traits
#include <type_traits> // for declval, is_convertible, enable_if_t, add_... #include <type_traits> // for declval, is_convertible, enable_if_t, add_...
#ifdef _MSC_VER #if defined(_MSC_VER) && !defined(__clang__)
#pragma warning(push) #pragma warning(push)
// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. // Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool.
@ -706,7 +706,7 @@ bool operator>=(const T& one, gsl::basic_string_span<CharT, Extent> other)
#endif #endif
} // namespace gsl } // namespace gsl
#ifdef _MSC_VER #if defined(_MSC_VER) && !defined(__clang__)
#pragma warning(pop) #pragma warning(pop)
#if _MSC_VER < 1910 #if _MSC_VER < 1910

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.8.7) cmake_minimum_required(VERSION 3.0.2)
project(GSLTests CXX) project(GSLTests CXX)
@ -33,14 +33,24 @@ endif()
# this interface adds compile options to how the tests are run # this interface adds compile options to how the tests are run
# please try to keep entries ordered =) # please try to keep entries ordered =)
add_library(gsl_tests_config INTERFACE) add_library(gsl_tests_config INTERFACE)
target_compile_options(gsl_tests_config INTERFACE if(MSVC) # MSVC or simulating MSVC
$<$<CXX_COMPILER_ID:MSVC>: target_compile_options(gsl_tests_config INTERFACE
${GSL_CPLUSPLUS_OPT}
/EHsc /EHsc
/W4 /W4
/WX /WX
> $<$<CXX_COMPILER_ID:Clang>:
${GSL_CPLUSPLUS_OPT} -Weverything
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>: -Wno-c++98-compat
-Wno-c++98-compat-pedantic
-Wno-missing-braces
-Wno-missing-prototypes
-Wno-unknown-attributes
$<$<EQUAL:${GSL_CXX_STANDARD},14>:-Wno-unused-member-function>
>
)
else()
target_compile_options(gsl_tests_config INTERFACE
-fno-strict-aliasing -fno-strict-aliasing
-Wall -Wall
-Wcast-align -Wcast-align
@ -48,16 +58,25 @@ target_compile_options(gsl_tests_config INTERFACE
-Wctor-dtor-privacy -Wctor-dtor-privacy
-Werror -Werror
-Wextra -Wextra
-Wno-missing-braces
-Wno-unknown-attributes
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wpedantic -Wpedantic
-Wshadow -Wshadow
-Wsign-conversion -Wsign-conversion
> $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
) -Weverything
-Wno-c++98-compat
-Wno-c++98-compat-pedantic
-Wno-missing-braces
-Wno-missing-prototypes
-Wno-padded
-Wno-unknown-attributes
$<$<EQUAL:${GSL_CXX_STANDARD},14>:-Wno-unused-member-function>
-Wno-weak-vtables
>
$<$<CXX_COMPILER_ID:Clang>:
$<$<CXX_COMPILER_VERSION:5.0.2>:-Wno-undefined-func-template>
>
)
endif(MSVC)
# for tests to find the catch header # for tests to find the catch header
target_include_directories(gsl_tests_config INTERFACE target_include_directories(gsl_tests_config INTERFACE
@ -121,34 +140,49 @@ endforeach(flag_var)
# this interface adds compile options to how the tests are run # this interface adds compile options to how the tests are run
# please try to keep entries ordered =) # please try to keep entries ordered =)
add_library(gsl_tests_config_noexcept INTERFACE) add_library(gsl_tests_config_noexcept INTERFACE)
target_compile_options(gsl_tests_config_noexcept INTERFACE if(MSVC) # MSVC or simulating MSVC
$<$<CXX_COMPILER_ID:MSVC>: target_compile_definitions(gsl_tests_config_noexcept INTERFACE
/D_HAS_EXCEPTIONS=0 _HAS_EXCEPTIONS=0
/wd4702 )
/wd4577 target_compile_options(gsl_tests_config_noexcept INTERFACE
${GSL_CPLUSPLUS_OPT}
/W4 /W4
/WX /WX
> $<$<CXX_COMPILER_ID:MSVC>:
${GSL_CPLUSPLUS_OPT} /wd4577
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>: /wd4702
-fno-strict-aliasing >
$<$<CXX_COMPILER_ID:Clang>:
-Weverything
-Wno-c++98-compat
-Wno-c++98-compat-pedantic
-Wno-missing-prototypes
-Wno-unknown-attributes
>
)
else()
target_compile_options(gsl_tests_config_noexcept INTERFACE
-fno-exceptions -fno-exceptions
-fno-strict-aliasing
-Wall -Wall
-Wcast-align -Wcast-align
-Wconversion -Wconversion
-Wctor-dtor-privacy -Wctor-dtor-privacy
-Werror -Werror
-Wextra -Wextra
-Wno-missing-braces
-Wno-unknown-attributes
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wpedantic -Wpedantic
-Wshadow -Wshadow
-Wsign-conversion -Wsign-conversion
> $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
) -Weverything
-Wno-c++98-compat
-Wno-c++98-compat-pedantic
-Wno-missing-prototypes
-Wno-unknown-attributes
-Wno-weak-vtables
>
)
endif(MSVC)
# set definitions for tests # set definitions for tests
target_compile_definitions(gsl_tests_config_noexcept INTERFACE target_compile_definitions(gsl_tests_config_noexcept INTERFACE

View File

@ -1782,4 +1782,4 @@ TEST_CASE("iterator")
#ifdef CONFIRM_COMPILATION_ERRORS #ifdef CONFIRM_COMPILATION_ERRORS
copy(src_span_static, dst_span_static); copy(src_span_static, dst_span_static);
#endif #endif

View File

@ -14,21 +14,17 @@
// //
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#include <cstdlib> // for std::exit #include <cstdlib> // for std::exit
#include <gsl/span> // for span #include <gsl/span> // for span
int operator_subscript_no_throw() noexcept int operator_subscript_no_throw() noexcept
{ {
int arr[10]; int arr[10];
const gsl::span<int> sp { arr }; const gsl::span<int> sp{arr};
return sp[11]; return sp[11];
} }
[[noreturn]] void test_terminate() { std::exit(0); }
void test_terminate()
{
std::exit(0);
}
void setup_termination_handler() noexcept void setup_termination_handler() noexcept
{ {
@ -44,7 +40,6 @@ void setup_termination_handler() noexcept
#endif #endif
} }
int main() noexcept int main() noexcept
{ {
setup_termination_handler(); setup_termination_handler();

View File

@ -14,20 +14,17 @@
// //
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#include <cstdlib> // for std::exit #include <cstdlib> // for std::exit
#include <gsl/gsl_util> // for narrow
#include <gsl/gsl_assert> // for get_terminate #include <gsl/gsl_assert> // for get_terminate
#include <gsl/gsl_util> // for narrow
int narrow_no_throw() int narrow_no_throw()
{ {
const long long bigNumber = 0x0fffffffffffffff; const long long bigNumber = 0x0fffffffffffffff;
return gsl::narrow<int>(bigNumber); return gsl::narrow<int>(bigNumber);
} }
void test_terminate() [[noreturn]] void test_terminate() { std::exit(0); }
{
std::exit(0);
}
void setup_termination_handler() noexcept void setup_termination_handler() noexcept
{ {
@ -43,7 +40,6 @@ void setup_termination_handler() noexcept
#endif #endif
} }
int main() int main()
{ {
setup_termination_handler(); setup_termination_handler();

View File

@ -251,7 +251,7 @@ TEST_CASE("TestNotNullostream")
{ {
ostream_helper<int>(17); ostream_helper<int>(17);
ostream_helper<float>(21.5f); ostream_helper<float>(21.5f);
ostream_helper<double>(3.4566e-7f); ostream_helper<double>(3.4566e-7);
ostream_helper<char>('c'); ostream_helper<char>('c');
ostream_helper<uint16_t>(0x0123u); ostream_helper<uint16_t>(0x0123u);
ostream_helper<const char*>("cstring"); ostream_helper<const char*>("cstring");

View File

@ -37,9 +37,10 @@
#include <type_traits> // for integral_constant<>::value, is_default_co... #include <type_traits> // for integral_constant<>::value, is_default_co...
#include <vector> // for vector #include <vector> // for vector
namespace gsl { namespace gsl
{
struct fail_fast; struct fail_fast;
} // namespace gsl } // namespace gsl
using namespace std; using namespace std;
using namespace gsl; using namespace gsl;
@ -54,9 +55,12 @@ struct DerivedClass : BaseClass
}; };
struct AddressOverloaded struct AddressOverloaded
{ {
#if (__cplusplus > 201402L)
[[maybe_unused]]
#endif
AddressOverloaded operator&() const { return {}; } AddressOverloaded operator&() const { return {}; }
}; };
} } // namespace
GSL_SUPPRESS(con.4) // NO-FORMAT: attribute GSL_SUPPRESS(con.4) // NO-FORMAT: attribute
TEST_CASE("default_constructor") TEST_CASE("default_constructor")
@ -513,8 +517,8 @@ TEST_CASE("from_std_array_constructor")
static span<int> s2; static span<int> s2;
s2 = s1; s2 = s1;
#if __GNUC__ == 6 && (__GNUC_MINOR__ == 4 || __GNUC_MINOR__ == 5) && __GNUC_PATCHLEVEL__ == 0 && \ #if defined(__GNUC__) && __GNUC__ == 6 && (__GNUC_MINOR__ == 4 || __GNUC_MINOR__ == 5) && \
defined(__OPTIMIZE__) __GNUC_PATCHLEVEL__ == 0 && defined(__OPTIMIZE__)
// Known to be broken in gcc 6.4 and 6.5 with optimizations // Known to be broken in gcc 6.4 and 6.5 with optimizations
// Issue in gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83116 // Issue in gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83116
CHECK(s1.size() == 4); CHECK(s1.size() == 4);

View File

@ -117,7 +117,7 @@ TEST_CASE("strided_span_constructors")
CHECK(sav.bounds().strides() == multi_span_index<1>{1}); CHECK(sav.bounds().strides() == multi_span_index<1>{1});
CHECK(sav[1] == 2); CHECK(sav[1] == 2);
#if _MSC_VER > 1800 #if defined(_MSC_VER) && _MSC_VER > 1800
// strided_span<const int, 1> sav_c{ {src}, {2, 1} }; // strided_span<const int, 1> sav_c{ {src}, {2, 1} };
strided_span<const int, 1> sav_c{multi_span<const int>{src}, strided_span<const int, 1> sav_c{multi_span<const int>{src},
strided_bounds<1>{2, 1}}; strided_bounds<1>{2, 1}};
@ -129,7 +129,7 @@ TEST_CASE("strided_span_constructors")
CHECK(sav_c.bounds().strides() == multi_span_index<1>{1}); CHECK(sav_c.bounds().strides() == multi_span_index<1>{1});
CHECK(sav_c[1] == 2); CHECK(sav_c[1] == 2);
#if _MSC_VER > 1800 #if defined(_MSC_VER) && _MSC_VER > 1800
strided_span<volatile int, 1> sav_v{src, {2, 1}}; strided_span<volatile int, 1> sav_v{src, {2, 1}};
#else #else
strided_span<volatile int, 1> sav_v{multi_span<volatile int>{src}, strided_span<volatile int, 1> sav_v{multi_span<volatile int>{src},
@ -139,7 +139,7 @@ TEST_CASE("strided_span_constructors")
CHECK(sav_v.bounds().strides() == multi_span_index<1>{1}); CHECK(sav_v.bounds().strides() == multi_span_index<1>{1});
CHECK(sav_v[1] == 2); CHECK(sav_v[1] == 2);
#if _MSC_VER > 1800 #if defined(_MSC_VER) && _MSC_VER > 1800
strided_span<const volatile int, 1> sav_cv{src, {2, 1}}; strided_span<const volatile int, 1> sav_cv{src, {2, 1}};
#else #else
strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src}, strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src},
@ -159,7 +159,7 @@ TEST_CASE("strided_span_constructors")
CHECK(sav_c.bounds().strides() == multi_span_index<1>{1}); CHECK(sav_c.bounds().strides() == multi_span_index<1>{1});
CHECK(sav_c[1] == 2); CHECK(sav_c[1] == 2);
#if _MSC_VER > 1800 #if defined(_MSC_VER) && _MSC_VER > 1800
strided_span<const volatile int, 1> sav_cv{src, {2, 1}}; strided_span<const volatile int, 1> sav_cv{src, {2, 1}};
#else #else
strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src}, strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src},
@ -180,7 +180,7 @@ TEST_CASE("strided_span_constructors")
CHECK(sav_v.bounds().strides() == multi_span_index<1>{1}); CHECK(sav_v.bounds().strides() == multi_span_index<1>{1});
CHECK(sav_v[1] == 2); CHECK(sav_v[1] == 2);
#if _MSC_VER > 1800 #if defined(_MSC_VER) && _MSC_VER > 1800
strided_span<const volatile int, 1> sav_cv{src, {2, 1}}; strided_span<const volatile int, 1> sav_cv{src, {2, 1}};
#else #else
strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src}, strided_span<const volatile int, 1> sav_cv{multi_span<const volatile int>{src},
@ -598,7 +598,7 @@ void iterate_every_other_element(multi_span<int, dynamic_range> av)
// pick every other element // pick every other element
auto length = av.size() / 2; auto length = av.size() / 2;
#if _MSC_VER > 1800 #if defined(_MSC_VER) && _MSC_VER > 1800
auto bounds = strided_bounds<1>({length}, {2}); auto bounds = strided_bounds<1>({length}, {2});
#else #else
auto bounds = strided_bounds<1>(multi_span_index<1>{length}, multi_span_index<1>{2}); auto bounds = strided_bounds<1>(multi_span_index<1>{length}, multi_span_index<1>{2});

View File

@ -80,7 +80,7 @@ TEST_CASE("finally_function_with_bind")
CHECK(i == 1); CHECK(i == 1);
} }
int j = 0; static int j = 0;
void g() { j += 1; } void g() { j += 1; }
TEST_CASE("finally_function_ptr") TEST_CASE("finally_function_ptr")
{ {