[PATCH] Add more specific lexer flags for misc GNU extensions
David Blaikie
dblaikie at gmail.com
Sun Aug 25 10:21:30 PDT 2013
On Aug 24, 2013 2:39 AM, "Peter N Lewis" <peter at stairways.com.au> wrote:
>
> Ping.
>
> Eli queried whether -Wgnu-zero-variadic-macro-argumentsand
-Wgnu-token-pasting-comma should be a single flag (which is fine with me,
but then what to call it) and questioned whether -Wgnu-line-zero-directive
is correct as 'it isn't really a "line-zero" directive', which I didn't
quite follow, but I'm happy to change it if anyone else has a better name.
Bes guess on an alternative name would be 'zero line directive' (a line
directive that is zero, rather than a 'line zero' directive)
>
> Thanks,
> Peter.
>
> On 21/08/2013, at 21:10 , Peter N Lewis <peter at stairways.com.au> wrote:
>
> > Here is batch two of the specific gnu flags. This patch adds the
following flags:
> >
> > -Wgnu-zero-variadic-macro-arguments
> > -Wgnu-token-pasting-comma
> > -Wgnu-imaginary-constant
> > -Wgnu-binary-literal
> > -Wgnu-line-zero-directive
> >
> > I'm not overly convinced on the exact naming of the flags, but they
were the best I could come up with. I'd be happy to hear any thoughts.
> >
> > The patch includes a test with four invocations, and another five
disabled by default.
> >
> >
> > Index: test/Lexer/gnu-flags.c
> > ===================================================================
> > --- test/Lexer/gnu-flags.c (revision 0)
> > +++ test/Lexer/gnu-flags.c (revision 0)
> > @@ -0,0 +1,58 @@
> > +// RUN: %clang_cc1 -fsyntax-only -verify %s -DNONE
> > +// RUN: %clang_cc1 -fsyntax-only -verify %s -DALL -Wgnu
> > +// RUN: %clang_cc1 -fsyntax-only -verify %s -DALL \
> > +// RUN: -Wgnu-zero-variadic-macro-arguments
-Wgnu-token-pasting-comma \
> > +// RUN: -Wgnu-imaginary-constant -Wgnu-binary-literal
-Wgnu-line-zero-directive
> > +// RUN: %clang_cc1 -fsyntax-only -verify %s -DNONE -Wgnu \
> > +// RUN: -Wno-gnu-zero-variadic-macro-arguments
-Wno-gnu-token-pasting-comma \
> > +// RUN: -Wno-gnu-imaginary-constant -Wno-gnu-binary-literal
-Wno-gnu-line-zero-directive
> > +// RUNNOT: %clang_cc1 -fsyntax-only -verify %s -DZEROARGS
-Wgnu-zero-variadic-macro-arguments
> > +// RUNNOT: %clang_cc1 -fsyntax-only -verify %s -DTOKENPASTING
-Wgnu-token-pasting-comma
> > +// RUNNOT: %clang_cc1 -fsyntax-only -verify %s -DIMAGINARYCONST
-Wgnu-imaginary-constant
> > +// RUNNOT: %clang_cc1 -fsyntax-only -verify %s -DBINARYLITERAL
-Wgnu-binary-literal
> > +// RUNNOT: %clang_cc1 -fsyntax-only -verify %s -DLINE0
-Wgnu-line-zero-directive
> > +
> > +#if NONE
> > +// expected-no-diagnostics
> > +#endif
> > +
> > +
> > +#if ALL || ZEROARGS
> > +// expected-warning at +11 {{must specify at least one argument for '...'
parameter of variadic macro}}
> > +// expected-note at +6 {{macro 'efoo' defined here}}
> > +#endif
> > +#if ALL || TOKENPASTING
> > +// expected-warning at +3 {{token pasting of ',' and __VA_ARGS__ is a GNU
extension}}
> > +#endif
> > +
> > +#define efoo(format, args...) foo(format , ##args)
> > +
> > +void foo( const char* c )
> > +{
> > + efoo("6");
> > +}
> > +
> > +
> > +#if ALL || IMAGINARYCONST
> > +// expected-warning at +3 {{imaginary constants are a GNU extension}}
> > +#endif
> > +
> > +float _Complex c = 1.if;
> > +
> > +
> > +#if ALL || BINARYLITERAL
> > +// expected-warning at +3 {{binary integer literals are a GNU extension}}
> > +#endif
> > +
> > +int b = 0b0101;
> > +
> > +
> > +// This case is handled differently because lit has a bug whereby
#line 0 is reported to be on line 4294967295
> > +// http://llvm.org/bugs/show_bug.cgi?id=16952
> > +#if ALL || LINE0
> > +#line 0 // expected-warning {{#line directive with zero argument is a
GNU extension}}
> > +#else
> > +#line 0
> > +#endif
> > +
> > +// WARNING: Do not add more tests after the #line 0 line! Add them
before the LINE0 test
> > Index: include/clang/Basic/DiagnosticGroups.td
> > ===================================================================
> > --- include/clang/Basic/DiagnosticGroups.td (revision 188870)
> > +++ include/clang/Basic/DiagnosticGroups.td (working copy)
> > @@ -28,6 +28,7 @@
> > def Availability : DiagGroup<"availability">;
> > def Section : DiagGroup<"section">;
> > def AutoImport : DiagGroup<"auto-import">;
> > +def GNUBinaryLiteral : DiagGroup<"gnu-binary-literal">;
> > def BitFieldConstantConversion :
DiagGroup<"bitfield-constant-conversion">;
> > def ConstantConversion :
> > DiagGroup<"constant-conversion", [ BitFieldConstantConversion ] >;
> > @@ -152,6 +153,7 @@
> > def DanglingElse: DiagGroup<"dangling-else">;
> > def DanglingField : DiagGroup<"dangling-field">;
> > def DistributedObjectModifiers :
DiagGroup<"distributed-object-modifiers">;
> > +def GNUImaginaryConstant : DiagGroup<"gnu-imaginary-constant">;
> > def IgnoredQualifiers : DiagGroup<"ignored-qualifiers">;
> > def : DiagGroup<"import">;
> > def IncompatiblePointerTypesDiscardsQualifiers
> > @@ -168,6 +170,7 @@
> > def : DiagGroup<"inline">;
> > def : DiagGroup<"invalid-pch">;
> > def GNULabelsAsValue : DiagGroup<"gnu-label-as-value">;
> > +def GNULineZeroDirective : DiagGroup<"gnu-line-zero-directive">;
> > def LiteralRange : DiagGroup<"literal-range">;
> > def LocalTypeTemplateArgs : DiagGroup<"local-type-template-args",
> >
[CXX98CompatLocalTypeTemplateArgs]>;
> > @@ -260,6 +263,7 @@
> > def TautologicalOutOfRangeCompare :
DiagGroup<"tautological-constant-out-of-range-compare">;
> > def TautologicalCompare : DiagGroup<"tautological-compare",
> > [TautologicalOutOfRangeCompare]>;
> > +def GNUTokenPastingComma : DiagGroup<"gnu-token-pasting-comma">;
> > def HeaderHygiene : DiagGroup<"header-hygiene">;
> > def DuplicateDeclSpecifier : DiagGroup<"duplicate-decl-specifier">;
> > def CompareDistinctPointerType :
DiagGroup<"compare-distinct-pointer-types">;
> > @@ -368,6 +372,7 @@
> > def VolatileRegisterVar : DiagGroup<"volatile-register-var">;
> > def Visibility : DiagGroup<"visibility">;
> > def ZeroLengthArray : DiagGroup<"zero-length-array">;
> > +def GNUZeroVariadicMacroArguments :
DiagGroup<"gnu-zero-variadic-macro-arguments">;
> >
> > // GCC calls -Wdeprecated-writable-strings -Wwrite-strings.
> > def GCCWriteStrings : DiagGroup<"write-strings" ,
[DeprecatedWritableStr]>;
> > @@ -534,14 +539,15 @@
> > def C99 : DiagGroup<"c99-extensions">;
> >
> > // A warning group for warnings about GCC extensions.
> > -def GNU : DiagGroup<"gnu", [GNUAlignofExpression, GNUCaseRange,
> > - GNUComplexInteger,
> > +def GNU : DiagGroup<"gnu", [GNUAlignofExpression, GNUBinaryLiteral,
> > + GNUCaseRange, GNUComplexInteger,
> > GNUConditionalOmittedOperand,
> > GNUDesignator, GNUEmptyInitializer,
> > VLAExtension,
> > - GNULabelsAsValue,
> > - GNUStatementExpression, GNUStaticFloatInit,
> > - ZeroLengthArray]>;
> > + GNUImaginaryConstant, GNULabelsAsValue,
> > + GNULineZeroDirective,
GNUStatementExpression,
> > + GNUStaticFloatInit, GNUTokenPastingComma,
> > + ZeroLengthArray,
GNUZeroVariadicMacroArguments]>;
> > // A warning group for warnings about code that clang accepts but gcc
doesn't.
> > def GccCompat : DiagGroup<"gcc-compat">;
> >
> > Index: include/clang/Basic/DiagnosticLexKinds.td
> > ===================================================================
> > --- include/clang/Basic/DiagnosticLexKinds.td (revision 188870)
> > +++ include/clang/Basic/DiagnosticLexKinds.td (working copy)
> > @@ -165,7 +165,7 @@
> > "Unicode character literals may not contain multiple characters">;
> > def err_exponent_has_no_digits : Error<"exponent has no digits">;
> > def ext_imaginary_constant : Extension<
> > - "imaginary constants are a GNU extension">, InGroup<GNU>;
> > + "imaginary constants are a GNU extension">,
InGroup<GNUImaginaryConstant>;
> > def err_hexconstant_requires_exponent : Error<
> > "hexadecimal floating constants require an exponent">;
> > def err_hexconstant_requires_digits : Error<
> > @@ -173,7 +173,7 @@
> > def ext_hexconstant_invalid : Extension<
> > "hexadecimal floating constants are a C99 feature">, InGroup<C99>;
> > def ext_binary_literal : Extension<
> > - "binary integer literals are a GNU extension">, InGroup<GNU>;
> > + "binary integer literals are a GNU extension">,
InGroup<GNUBinaryLiteral>;
> > def ext_binary_literal_cxx1y : Extension<
> > "binary integer literals are a C++1y extension">, InGroup<CXX1y>;
> > def warn_cxx11_compat_binary_literal : Warning<
> > @@ -320,7 +320,7 @@
> > InGroup<DiagGroup<"embedded-directive">>;
> > def ext_missing_varargs_arg : Extension<
> > "must specify at least one argument for '...' parameter of variadic
macro">,
> > - InGroup<GNU>;
> > + InGroup<GNUZeroVariadicMacroArguments>;
> > def ext_empty_fnmacro_arg : Extension<
> > "empty macro arguments are a C99 feature">, InGroup<C99>;
> > def warn_cxx98_compat_empty_fnmacro_arg : Warning<
> > @@ -455,7 +455,7 @@
> > "'##' cannot appear at start of macro expansion">;
> > def err_paste_at_end : Error<"'##' cannot appear at end of macro
expansion">;
> > def ext_paste_comma : Extension<
> > - "token pasting of ',' and __VA_ARGS__ is a GNU extension">,
InGroup<GNU>;
> > + "token pasting of ',' and __VA_ARGS__ is a GNU extension">,
InGroup<GNUTokenPastingComma>;
> > def err_unterm_macro_invoc : Error<
> > "unterminated function-like macro invocation">;
> > def err_too_many_args_in_macro_invoc : Error<
> > @@ -480,7 +480,7 @@
> > "#line directive requires a positive integer argument">;
> > def ext_pp_line_zero : Extension<
> > "#line directive with zero argument is a GNU extension">,
> > - InGroup<GNU>;
> > + InGroup<GNULineZeroDirective>;
> > def err_pp_line_invalid_filename : Error<
> > "invalid filename for #line directive">;
> > def warn_pp_line_decimal : Warning<
> >
> > <gnu-lex-flags.diff>
> >
> > --
> > Keyboard Maestro 6.1 now out - set web checkboxes & radio buttons, exit
from loops, and more.
> >
> > Keyboard Maestro <http://www.keyboardmaestro.com/> Macros for your Mac
> > <http://www.stairways.com/> <
http://download.keyboardmaestro.com/>
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
> --
> Keyboard Maestro 6.2 now out - control Mail, reveal a file, format
AppleScripts and more.
>
> Keyboard Maestro <http://www.keyboardmaestro.com/> Macros for your Mac
> <http://www.stairways.com/> <
http://download.keyboardmaestro.com/>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130825/8b0c4797/attachment.html>
More information about the cfe-commits
mailing list