2
0
mirror of https://github.com/boostorg/wave.git synced 2026-01-19 16:52:15 +00:00
Files
wave/test/testwave/testfiles/t_2_026.cpp
Jeff Trull 59610d6f79 Extend __has_include() grammar for arbitrary conditional expressions (#144)
* Extend __has_include grammar for complex conditional expressions

The logic handling __has_include erroneously assumed it would always
be the last expression on a line. This code fixes that by extending
the grammar to only consume the __has_include() itself, and count
parentheses as necessary to find the correct input range.

Also add some unit tests to cover the error in the future.

* While I'm at it, a couple of small cleanups

1) Remove unneeded header
2) The wrong BOOST_SPIRIT_DEBUG_TRACE_RULE was commented out
2022-01-18 10:46:16 -08:00

77 lines
2.4 KiB
C++

/*=============================================================================
Boost.Wave: A Standard compliant C++ preprocessor library
http://www.boost.org/
Copyright (c) 2020 Jeff Trull. Distributed under the Boost
Software License, Version 1.0. (See accompanying file
LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
//O --c++17
//O -Werror
// Test __has_include() with some interesting cases
#if __has_include(/* comment */ __FILE__ /* comment */)
#define GOTTHISFILE_WITHCOMMENTS
#else
#warning cannot find using file macro when comments are present
#endif
//H 10: t_2_026.cpp(15): #if
//H 01: <built-in>(1): __FILE__
//H 02: "$F"
//H 03: "$F"
//H 11: t_2_026.cpp(15): #if __has_include(/* comment */ __FILE__ /* comment */): 1
//H 10: t_2_026.cpp(16): #define
//H 08: t_2_026.cpp(16): GOTTHISFILE_WITHCOMMENTS=
//H 10: t_2_026.cpp(17): #else
// Using __has_include() in a larger expression
#if __has_include("t_2_026.cpp") && 1
#define GOTFILE_ANDWITHTRUE
#else
#warning has_include of ourselves anded with 1 failed
#endif
#if __has_include("t_2_026.cpp") && 0
#warning has_include of ourselves anded with 0 should fail but did not
#else
#define NOFILE_ANDWITHFALSE
#endif
#if !__has_include("t_2_026.cpp") || 1
#define NOFILE_ORWITHTRUE
#else
#warning not has_include of ourselves ored with 1 failed
#endif
#if !__has_include("t_2_026.cpp") || 0
#warning not has_included of ourselves ored with 0 should fail but did not
#else
#define NOFILE_ORWITHFALSE
#endif
//H 10: t_2_026.cpp(33): #if
//H 11: t_2_026.cpp(33): #if __has_include("t_2_026.cpp") && 1: 1
//H 10: t_2_026.cpp(34): #define
//H 08: t_2_026.cpp(34): GOTFILE_ANDWITHTRUE=
//H 10: t_2_026.cpp(35): #else
//H 10: t_2_026.cpp(39): #if
//H 11: t_2_026.cpp(39): #if __has_include("t_2_026.cpp") && 0: 0
//H 10: t_2_026.cpp(42): #define
//H 08: t_2_026.cpp(42): NOFILE_ANDWITHFALSE=
//H 10: t_2_026.cpp(43): #endif
//H 10: t_2_026.cpp(45): #if
//H 11: t_2_026.cpp(45): #if !__has_include("t_2_026.cpp") || 1: 1
//H 10: t_2_026.cpp(46): #define
//H 08: t_2_026.cpp(46): NOFILE_ORWITHTRUE=
//H 10: t_2_026.cpp(47): #else
//H 10: t_2_026.cpp(51): #if
//H 11: t_2_026.cpp(51): #if !__has_include("t_2_026.cpp") || 0: 0
//H 10: t_2_026.cpp(54): #define
//H 08: t_2_026.cpp(54): NOFILE_ORWITHFALSE=
//H 10: t_2_026.cpp(55): #endif