diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/LangOptions.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Lex/DependencyDirectivesScanner.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Lex/Lexer.cpp | 10 |
5 files changed, 23 insertions, 7 deletions
diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 61072b7..e5adc03 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -125,6 +125,7 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, Opts.HexFloats = Std.hasHexFloats(); Opts.WChar = Std.isCPlusPlus(); Opts.Digraphs = Std.hasDigraphs(); + Opts.RawStringLiterals = Std.hasRawStringLiterals(); Opts.HLSL = Lang == Language::HLSL; if (Opts.HLSL && Opts.IncludeDefaultHeader) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 6ba0d56..edb3c20 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6519,6 +6519,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); Args.AddLastArg(CmdArgs, options::OPT_fdigraphs, options::OPT_fno_digraphs); Args.AddLastArg(CmdArgs, options::OPT_fzero_call_used_regs_EQ); + Args.AddLastArg(CmdArgs, options::OPT_fraw_string_literals, + options::OPT_fno_raw_string_literals); if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls, Triple.hasDefaultEmulatedTLS())) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index f42e28b..0082c15 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -610,6 +610,19 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.NewAlignOverride = 0; } + // The -f[no-]raw-string-literals option is only valid in C and in C++ + // standards before C++11. + if (LangOpts.CPlusPlus11) { + if (Args.hasArg(OPT_fraw_string_literals, OPT_fno_raw_string_literals)) { + Args.claimAllArgs(OPT_fraw_string_literals, OPT_fno_raw_string_literals); + Diags.Report(diag::warn_drv_fraw_string_literals_in_cxx11) + << bool(LangOpts.RawStringLiterals); + } + + // Do not allow disabling raw string literals in C++11 or later. + LangOpts.RawStringLiterals = true; + } + // Prevent the user from specifying both -fsycl-is-device and -fsycl-is-host. if (LangOpts.SYCLIsDevice && LangOpts.SYCLIsHost) Diags.Report(diag::err_drv_argument_not_allowed_with) << "-fsycl-is-device" diff --git a/clang/lib/Lex/DependencyDirectivesScanner.cpp b/clang/lib/Lex/DependencyDirectivesScanner.cpp index 0971daa..57652be 100644 --- a/clang/lib/Lex/DependencyDirectivesScanner.cpp +++ b/clang/lib/Lex/DependencyDirectivesScanner.cpp @@ -73,8 +73,8 @@ struct Scanner { // Set the lexer to use 'tok::at' for '@', instead of 'tok::unknown'. LangOpts.ObjC = true; LangOpts.LineComment = true; - // FIXME: we do not enable C11 or C++11, so we are missing u/u8/U"" and - // R"()" literals. + LangOpts.RawStringLiterals = true; + // FIXME: we do not enable C11 or C++11, so we are missing u/u8/U"". return LangOpts; } diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp index e59c780..ef1e1f4 100644 --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -3876,7 +3876,7 @@ LexStart: tok::utf16_char_constant); // UTF-16 raw string literal - if (Char == 'R' && LangOpts.CPlusPlus11 && + if (Char == 'R' && LangOpts.RawStringLiterals && getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == '"') return LexRawStringLiteral(Result, ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), @@ -3898,7 +3898,7 @@ LexStart: SizeTmp2, Result), tok::utf8_char_constant); - if (Char2 == 'R' && LangOpts.CPlusPlus11) { + if (Char2 == 'R' && LangOpts.RawStringLiterals) { unsigned SizeTmp3; char Char3 = getCharAndSize(CurPtr + SizeTmp + SizeTmp2, SizeTmp3); // UTF-8 raw string literal @@ -3934,7 +3934,7 @@ LexStart: tok::utf32_char_constant); // UTF-32 raw string literal - if (Char == 'R' && LangOpts.CPlusPlus11 && + if (Char == 'R' && LangOpts.RawStringLiterals && getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == '"') return LexRawStringLiteral(Result, ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), @@ -3949,7 +3949,7 @@ LexStart: // Notify MIOpt that we read a non-whitespace/non-comment token. MIOpt.ReadToken(); - if (LangOpts.CPlusPlus11) { + if (LangOpts.RawStringLiterals) { Char = getCharAndSize(CurPtr, SizeTmp); if (Char == '"') @@ -3972,7 +3972,7 @@ LexStart: tok::wide_string_literal); // Wide raw string literal. - if (LangOpts.CPlusPlus11 && Char == 'R' && + if (LangOpts.RawStringLiterals && Char == 'R' && getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == '"') return LexRawStringLiteral(Result, ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), |