ken-matsui updated this revision to Diff 425916. ken-matsui added a comment.
Add a diagnostic for line directive of a gnu extension Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124534/new/ https://reviews.llvm.org/D124534 Files: clang/include/clang/Basic/DiagnosticGroups.td clang/include/clang/Basic/DiagnosticLexKinds.td clang/lib/Lex/PPDirectives.cpp clang/test/Misc/warning-flags.c clang/test/Preprocessor/line-directive.c Index: clang/test/Preprocessor/line-directive.c =================================================================== --- clang/test/Preprocessor/line-directive.c +++ clang/test/Preprocessor/line-directive.c @@ -9,7 +9,7 @@ # 20 "" 2 // a push/pop before any other line control -# 10 "enter-0" 1 +# 10 "enter-0" 1 // expected-warning {{this style of line directive is a GNU extension}} # 11 "" 2 // pop to main file #error MAIN7 // expected-error@-1{{MAIN7}} @@ -30,7 +30,7 @@ # 42 // expected-warning {{this style of line directive is a GNU extension}} # 42 "foo" // expected-warning {{this style of line directive is a GNU extension}} # 42 "foo" 2 // expected-error {{invalid line marker flag '2': cannot pop empty include stack}} -# 42 "foo" 1 3 // enter +# 42 "foo" 1 3 // enter expected-warning {{this style of line directive is a GNU extension}} # 42 "foo" 2 3 // exit # 42 "foo" 2 3 4 // expected-error {{invalid line marker flag '2': cannot pop empty include stack}} # 42 "foo" 3 4 @@ -116,8 +116,8 @@ undefined t; // expected-error {{unknown type name 'undefined'}} # 115 "main" // expected-warning {{this style of line directive is a GNU extension}} -# 116 "enter-1" 1 -# 117 "enter-2" 1 +# 116 "enter-1" 1 // expected-warning {{this style of line directive is a GNU extension}} +# 117 "enter-2" 1 // expected-warning {{this style of line directive is a GNU extension}} # 118 "" 2 // pop to enter-1 #error ENTER1 // expected-error@-1{{ENTER1}} Index: clang/test/Misc/warning-flags.c =================================================================== --- clang/test/Misc/warning-flags.c +++ clang/test/Misc/warning-flags.c @@ -90,4 +90,4 @@ The list of warnings in -Wpedantic should NEVER grow. -CHECK: Number in -Wpedantic (not covered by other -W flags): 28 +CHECK: Number in -Wpedantic (not covered by other -W flags): 27 Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -1346,9 +1346,14 @@ IsFileEntry = true; PP.Lex(FlagTok); - if (FlagTok.is(tok::eod)) return false; + if (FlagTok.is(tok::eod)) { + PP.Diag(FlagTok, diag::ext_pp_gnu_line_directive); + return false; + } if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP)) return true; + + PP.Diag(FlagTok, diag::ext_pp_gnu_line_directive); } else if (FlagVal == 2) { IsFileExit = true; Index: clang/include/clang/Basic/DiagnosticLexKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticLexKinds.td +++ clang/include/clang/Basic/DiagnosticLexKinds.td @@ -428,7 +428,8 @@ "variadic macros are a Clang extension in OpenCL">; def ext_pp_gnu_line_directive : Extension< - "this style of line directive is a GNU extension">; + "this style of line directive is a GNU extension">, + InGroup<GNULineMarker>; def err_pp_invalid_directive : Error<"invalid preprocessing directive">; def err_pp_directive_required : Error< Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -450,6 +450,7 @@ def : DiagGroup<"inline">; def : DiagGroup<"invalid-pch">; def GNULabelsAsValue : DiagGroup<"gnu-label-as-value">; +def GNULineMarker : DiagGroup<"gnu-line-marker">; def LiteralRange : DiagGroup<"literal-range">; def LocalTypeTemplateArgs : DiagGroup<"local-type-template-args", [CXX98CompatLocalTypeTemplateArgs]>;
Index: clang/test/Preprocessor/line-directive.c =================================================================== --- clang/test/Preprocessor/line-directive.c +++ clang/test/Preprocessor/line-directive.c @@ -9,7 +9,7 @@ # 20 "" 2 // a push/pop before any other line control -# 10 "enter-0" 1 +# 10 "enter-0" 1 // expected-warning {{this style of line directive is a GNU extension}} # 11 "" 2 // pop to main file #error MAIN7 // expected-error@-1{{MAIN7}} @@ -30,7 +30,7 @@ # 42 // expected-warning {{this style of line directive is a GNU extension}} # 42 "foo" // expected-warning {{this style of line directive is a GNU extension}} # 42 "foo" 2 // expected-error {{invalid line marker flag '2': cannot pop empty include stack}} -# 42 "foo" 1 3 // enter +# 42 "foo" 1 3 // enter expected-warning {{this style of line directive is a GNU extension}} # 42 "foo" 2 3 // exit # 42 "foo" 2 3 4 // expected-error {{invalid line marker flag '2': cannot pop empty include stack}} # 42 "foo" 3 4 @@ -116,8 +116,8 @@ undefined t; // expected-error {{unknown type name 'undefined'}} # 115 "main" // expected-warning {{this style of line directive is a GNU extension}} -# 116 "enter-1" 1 -# 117 "enter-2" 1 +# 116 "enter-1" 1 // expected-warning {{this style of line directive is a GNU extension}} +# 117 "enter-2" 1 // expected-warning {{this style of line directive is a GNU extension}} # 118 "" 2 // pop to enter-1 #error ENTER1 // expected-error@-1{{ENTER1}} Index: clang/test/Misc/warning-flags.c =================================================================== --- clang/test/Misc/warning-flags.c +++ clang/test/Misc/warning-flags.c @@ -90,4 +90,4 @@ The list of warnings in -Wpedantic should NEVER grow. -CHECK: Number in -Wpedantic (not covered by other -W flags): 28 +CHECK: Number in -Wpedantic (not covered by other -W flags): 27 Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -1346,9 +1346,14 @@ IsFileEntry = true; PP.Lex(FlagTok); - if (FlagTok.is(tok::eod)) return false; + if (FlagTok.is(tok::eod)) { + PP.Diag(FlagTok, diag::ext_pp_gnu_line_directive); + return false; + } if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP)) return true; + + PP.Diag(FlagTok, diag::ext_pp_gnu_line_directive); } else if (FlagVal == 2) { IsFileExit = true; Index: clang/include/clang/Basic/DiagnosticLexKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticLexKinds.td +++ clang/include/clang/Basic/DiagnosticLexKinds.td @@ -428,7 +428,8 @@ "variadic macros are a Clang extension in OpenCL">; def ext_pp_gnu_line_directive : Extension< - "this style of line directive is a GNU extension">; + "this style of line directive is a GNU extension">, + InGroup<GNULineMarker>; def err_pp_invalid_directive : Error<"invalid preprocessing directive">; def err_pp_directive_required : Error< Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -450,6 +450,7 @@ def : DiagGroup<"inline">; def : DiagGroup<"invalid-pch">; def GNULabelsAsValue : DiagGroup<"gnu-label-as-value">; +def GNULineMarker : DiagGroup<"gnu-line-marker">; def LiteralRange : DiagGroup<"literal-range">; def LocalTypeTemplateArgs : DiagGroup<"local-type-template-args", [CXX98CompatLocalTypeTemplateArgs]>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits