llvm-project/clang/test/Lexer
Nico Weber b2348f4ced Add -Wexpansion-to-undefined: warn when using `defined` in a macro definition.
[cpp.cond]p4:
  Prior to evaluation, macro invocations in the list of preprocessing
  tokens that will become the controlling constant expression are replaced
  (except for those macro names modified by the 'defined' unary operator),
  just as in normal text. If the token 'defined' is generated as a result
  of this replacement process or use of the 'defined' unary operator does
  not match one of the two specified forms prior to macro replacement, the
  behavior is undefined.

This isn't an idle threat, consider this program:
  #define FOO
  #define BAR defined(FOO)
  #if BAR
  ...
  #else
  ...
  #endif
clang and gcc will pick the #if branch while Visual Studio will take the
#else branch.  Emit a warning about this undefined behavior.

One problem is that this also applies to function-like macros. While the
example above can be written like

    #if defined(FOO) && defined(BAR)
    #defined HAVE_FOO 1
    #else
    #define HAVE_FOO 0
    #endif

there is no easy way to rewrite a function-like macro like `#define FOO(x)
(defined __foo_##x && __foo_##x)`.  Function-like macros like this are used in
practice, and compilers seem to not have differing behavior in that case. So
this a default-on warning only for object-like macros. For function-like
macros, it is an extension warning that only shows up with `-pedantic`.
(But it's undefined behavior in both cases.)

llvm-svn: 258128
2016-01-19 15:15:31 +00:00
..
Inputs Lex: reduce buffer size, add a test 2014-03-12 02:26:08 +00:00
11-27-2007-FloatLiterals.c
badstring_in_if0.c
bcpl-escaped-newline.c Add driver flags -ftrigraphs, -fno-trigraphs. 2014-12-23 22:32:37 +00:00
block_cmt_end.c Add driver flags -ftrigraphs, -fno-trigraphs. 2014-12-23 22:32:37 +00:00
builtin_redef.c
c90.c
char-escapes.c
char-literal-encoding-error.c
char-literal.cpp
comment-escape.c
conflict-marker.c Lex: Don't crash if both conflict markers are on the same line 2014-12-14 04:53:11 +00:00
constants.c Add driver flags -ftrigraphs, -fno-trigraphs. 2014-12-23 22:32:37 +00:00
coroutines.cpp [coroutines] Add forgotten test for lexing coroutines keywords. 2015-10-22 05:21:12 +00:00
counter.c
cross-windows-on-linux-default.cpp Lexer: split test into separate files 2014-03-12 02:53:12 +00:00
cross-windows-on-linux.cpp Fixing some comments in this test. No functional changes. 2014-05-19 14:52:09 +00:00
cxx-features.cpp Add -Wexpansion-to-undefined: warn when using `defined` in a macro definition. 2016-01-19 15:15:31 +00:00
cxx0x_keyword_as_cxx98.cpp [Tests] Add explicit -std=lang option to a number of tests. 2015-08-01 02:55:59 +00:00
cxx0x_raw_string_delim_length.cpp
cxx0x_raw_string_directives.cpp
cxx0x_raw_string_unterminated.cpp
cxx1y_binary_literal.cpp
cxx1y_digit_separators.cpp Add some missing checks for C++1y digit separators that don't in fact separate 2014-04-22 23:50:25 +00:00
cxx1z-trigraphs.cpp Add driver flags -ftrigraphs, -fno-trigraphs. 2014-12-23 22:32:37 +00:00
digraph.c
dollar-idents.c
eof-char.c
eof-file.c
eof-include.c Fix buffer overflow in Lexer 2015-05-04 22:30:29 +00:00
eof-number.c [lex] Don't read past the end of the buffer 2015-03-29 14:11:37 +00:00
eof-string.c
escape_newline.c Add driver flags -ftrigraphs, -fno-trigraphs. 2014-12-23 22:32:37 +00:00
gnu-flags.c
has_attribute_objc_boxable.m Add missing files for objc_boxable feature. 2015-07-23 14:45:41 +00:00
has_extension.c Add support for has_feature(cxx_alignof) and has_feature(c_alignof). 2014-12-03 01:25:49 +00:00
has_extension_cxx.cpp Have '__have_extension(cxx_variadic_templates)' return true for any C++ standard. 2015-05-12 22:37:23 +00:00
has_feature_address_sanitizer.cpp [ASan] Initial support for Kernel AddressSanitizer 2015-06-19 12:19:07 +00:00
has_feature_boxed_nsvalue_expressions.m Add missing files for objc_boxable feature. 2015-07-23 14:45:41 +00:00
has_feature_c1x.c Add support for has_feature(cxx_alignof) and has_feature(c_alignof). 2014-12-03 01:25:49 +00:00
has_feature_cxx0x.cpp [Tests] Add explicit -std=lang option to a number of tests. 2015-08-01 02:55:59 +00:00
has_feature_exceptions.cpp Lex: Fix __has_feature(cxx_exceptions) for objective C++ 2014-04-16 02:56:48 +00:00
has_feature_memory_sanitizer.cpp
has_feature_modules.m
has_feature_objc_arc.m
has_feature_rtti.cpp Turn off __has_feature(cxx_rtti) when -fno-rtti-data is present 2015-08-13 17:56:49 +00:00
has_feature_thread_sanitizer.cpp
has_feature_type_traits.cpp Added a __has_feature() for 'is_constructible' 2014-03-18 14:13:10 +00:00
header.cpp
hexfloat.cpp When pretty-printing a C++11 literal operator, don't insert whitespace between 2015-10-08 00:17:59 +00:00
keywords_test.c Add -f[no-]declspec to control recognition of __declspec as a keyword 2015-10-04 17:51:05 +00:00
keywords_test.cpp Add -f[no-]declspec to control recognition of __declspec as a keyword 2015-10-04 17:51:05 +00:00
long-long.cpp
ms-compatibility.c MSVC: A wide string literal from L#macro_arg in a macro 2014-12-15 04:18:11 +00:00
ms-extensions.c [MS Extensions] Remove support for the i128 integer literal suffix 2015-07-26 09:02:26 +00:00
ms-extensions.cpp [Tests] Add explicit -std=lang option to a number of tests. 2015-08-01 02:55:59 +00:00
msdos-cpm-eof.c Fix test from r256596 2015-12-29 23:23:38 +00:00
multiple-include.c
newline-eof-c++98-compat.cpp
newline-eof.c
numeric-literal-trash.c
objc_macros.m In Objective-C, ignore attempts to redefine the ARC/GC qualifier macros. 2015-12-10 23:31:01 +00:00
pragma-mark.c
pragma-message.c
pragma-message2.c
pragma-operators.cpp Add -fuse-line-directive flag to control usage of #line with -E 2015-02-26 00:17:25 +00:00
pragma-region.c
preamble.c
rdar-8914293.c
rdr-6096838-2.c
rdr-6096838.c
string-literal-encoding.c
string-literal-errors.cpp Don't destroy MacroInfos if we find the macro definition is invalid; it'll get 2014-08-03 23:41:04 +00:00
string_concat.cpp
token-concat.c
token-concat.cpp
unicode-strings.c
unicode.c Add test that we correctly allow some non-letter unicode characters in 2015-09-19 02:14:12 +00:00
unknown-char.c
utf-16.c
utf-16.c.txt
utf8-char-literal.cpp [c++1z] Support for u8 character literals. 2014-11-08 06:08:42 +00:00
utf8-invalid.c
warn-date-time.c Show -Wdate-time in system headers 2014-06-10 06:09:00 +00:00
warn_binary_literals.cpp Split off the binary literal warning into a subgroup of C++14 warnings 2015-09-18 23:18:39 +00:00
wchar-signedness.c [Thumb] Clang thinks "char" is signed when using a thumb triple 2014-10-24 11:28:47 +00:00
wchar.c