Skip to content

Commit 2154cff

Browse files
committed
[clang][cli] Store LangStandard::Kind in LangOptions
The `LangStandard::Kind` parsed from command line arguments is used to set up some `LangOption` defaults, but isn't stored anywhere. To be able to generate `-std=` (in future patch), we need `CompilerInvocation` to not forget it. This patch demonstrates another use-case: using `LangStd` to set up defaults of marshalled options. Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D95342
1 parent e72b22a commit 2154cff

File tree

5 files changed

+59
-8
lines changed

5 files changed

+59
-8
lines changed

clang/include/clang/Basic/LangOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "clang/Basic/CommentOptions.h"
1818
#include "clang/Basic/LLVM.h"
19+
#include "clang/Basic/LangStandard.h"
1920
#include "clang/Basic/ObjCRuntime.h"
2021
#include "clang/Basic/Sanitizers.h"
2122
#include "clang/Basic/Visibility.h"
@@ -257,6 +258,9 @@ class LangOptions : public LangOptionsBase {
257258
};
258259

259260
public:
261+
/// The used language standard.
262+
LangStandard::Kind LangStd;
263+
260264
/// Set of enabled sanitizers.
261265
SanitizerSet Sanitize;
262266

clang/include/clang/Driver/Options.td

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,8 +434,11 @@ class MarshallingInfoVisibility<KeyPathAndMacro kpm, code default>
434434
AutoNormalizeEnum {}
435435

436436
// Key paths that are constant during parsing of options with the same key path prefix.
437+
defvar lang_std = LangOpts<"LangStd">;
437438
defvar open_cl = LangOpts<"OpenCL">;
438439

440+
defvar std = !strconcat("LangStandard::getLangStandardForKind(", lang_std.KeyPath, ")");
441+
439442
/////////
440443
// Options
441444

@@ -1952,10 +1955,11 @@ def fno_common : Flag<["-"], "fno-common">, Group<f_Group>, Flags<[CC1Option]>,
19521955
HelpText<"Compile common globals like normal definitions">;
19531956
def fno_cxx_modules : Flag <["-"], "fno-cxx-modules">, Group<f_Group>,
19541957
Flags<[NoXarchOption]>;
1955-
def fdigraphs : Flag<["-"], "fdigraphs">, Group<f_Group>, Flags<[CC1Option]>,
1956-
HelpText<"Enable alternative token representations '<:', ':>', '<%', '%>', '%:', '%:%:' (default)">;
1957-
def fno_digraphs : Flag<["-"], "fno-digraphs">, Group<f_Group>, Flags<[CC1Option]>,
1958-
HelpText<"Disallow alternative token representations '<:', ':>', '<%', '%>', '%:', '%:%:'">;
1958+
defm digraphs : BoolFOption<"digraphs",
1959+
LangOpts<"Digraphs">, Default<std#".hasDigraphs()">,
1960+
PosFlag<SetTrue, [], "Enable alternative token representations '<:', ':>', '<%', '%>', '%:', '%:%:' (default)">,
1961+
NegFlag<SetFalse, [], "Disallow alternative token representations '<:', ':>', '<%', '%>', '%:', '%:%:'">,
1962+
BothFlags<[CC1Option]>>;
19591963
def fno_declspec : Flag<["-"], "fno-declspec">, Group<f_clang_Group>,
19601964
HelpText<"Disallow __declspec as a keyword">, Flags<[CC1Option]>;
19611965
def fno_dollars_in_identifiers : Flag<["-"], "fno-dollars-in-identifiers">, Group<f_Group>,

clang/lib/Basic/LangOptions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
using namespace clang;
1616

17-
LangOptions::LangOptions() {
17+
LangOptions::LangOptions() : LangStd(LangStandard::lang_unspecified) {
1818
#define LANGOPT(Name, Bits, Default, Description) Name = Default;
1919
#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) set##Name(Default);
2020
#include "clang/Basic/LangOptions.def"

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,6 +1971,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
19711971
}
19721972

19731973
const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
1974+
Opts.LangStd = LangStd;
19741975
Opts.LineComment = Std.hasLineComments();
19751976
Opts.C99 = Std.isC99();
19761977
Opts.C11 = Std.isC11();
@@ -1982,7 +1983,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
19821983
Opts.CPlusPlus17 = Std.isCPlusPlus17();
19831984
Opts.CPlusPlus20 = Std.isCPlusPlus20();
19841985
Opts.CPlusPlus2b = Std.isCPlusPlus2b();
1985-
Opts.Digraphs = Std.hasDigraphs();
19861986
Opts.GNUMode = Std.isGNUMode();
19871987
Opts.GNUInline = !Opts.C99 && !Opts.CPlusPlus;
19881988
Opts.GNUCVersion = 0;
@@ -2262,8 +2262,6 @@ void CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
22622262
Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords,
22632263
Opts.GNUKeywords);
22642264

2265-
Opts.Digraphs = Args.hasFlag(OPT_fdigraphs, OPT_fno_digraphs, Opts.Digraphs);
2266-
22672265
if (Args.hasArg(OPT_fno_operator_names))
22682266
Opts.CXXOperatorNames = 0;
22692267

clang/unittests/Frontend/CompilerInvocationTest.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,4 +695,49 @@ TEST_F(CommandLineTest, DiagnosticOptionPresent) {
695695

696696
ASSERT_THAT(GeneratedArgs, ContainsN(StrEq("-verify=xyz"), 1));
697697
}
698+
699+
// Option default depends on language standard.
700+
701+
TEST_F(CommandLineTest, DigraphsImplied) {
702+
const char *Args[] = {""};
703+
704+
ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags));
705+
ASSERT_TRUE(Invocation.getLangOpts()->Digraphs);
706+
707+
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
708+
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fno-digraphs"))));
709+
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fdigraphs"))));
710+
}
711+
712+
TEST_F(CommandLineTest, DigraphsDisabled) {
713+
const char *Args[] = {"-fno-digraphs"};
714+
715+
ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags));
716+
ASSERT_FALSE(Invocation.getLangOpts()->Digraphs);
717+
718+
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
719+
ASSERT_THAT(GeneratedArgs, Contains(StrEq("-fno-digraphs")));
720+
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fdigraphs"))));
721+
}
722+
723+
TEST_F(CommandLineTest, DigraphsNotImplied) {
724+
const char *Args[] = {"-std=c89"};
725+
726+
ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags));
727+
ASSERT_FALSE(Invocation.getLangOpts()->Digraphs);
728+
729+
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
730+
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fno-digraphs"))));
731+
ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-fdigraphs"))));
732+
}
733+
734+
TEST_F(CommandLineTest, DigraphsEnabled) {
735+
const char *Args[] = {"-std=c89", "-fdigraphs"};
736+
737+
ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags));
738+
ASSERT_TRUE(Invocation.getLangOpts()->Digraphs);
739+
740+
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
741+
ASSERT_THAT(GeneratedArgs, Contains(StrEq("-fdigraphs")));
742+
}
698743
} // anonymous namespace

0 commit comments

Comments
 (0)