diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-04-26 23:44:33 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-04-26 23:44:33 +0000 |
commit | b0fe70451e23a2b5ef19399d286c6a1cdaf5e686 (patch) | |
tree | f05534e837c1fad09fe652126e564b092add3fa6 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | 092e32e540c6d024b8bdcf30e81a9177d4cb9e37 (diff) | |
download | bcm5719-llvm-b0fe70451e23a2b5ef19399d286c6a1cdaf5e686.tar.gz bcm5719-llvm-b0fe70451e23a2b5ef19399d286c6a1cdaf5e686.zip |
Don't accept -std= values that would switch us to a different source language.
We already prohibited this in most cases (in r130710), but had some bugs in our
enforcement of this rule. Specifically, this prevents the following
combinations:
* -x c -std=clN.M, which would previously effectively act as if -x cl were
used, despite the input being a C source file. (-x cl -std=cNN continues
to be disallowed.)
* -x c++ -std=cuda, which would previously select C++98 + CUDA, despite that
not being a C++ standard. (-x cuda -std=c++NN is still permitted, and
selects CUDA with the given C++ standard as its base language.
-x cuda -std=cuda is still supported with the meaning of CUDA + C++98.)
* -x renderscript -std=c++NN, which would previously form a hybrid "C++ with
RenderScript extensions" language. We could support such a thing, but
shouldn't do so by accident.
llvm-svn: 301497
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d74c659dae1..dbbe6af6ab0 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1620,7 +1620,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, Opts.ImplicitInt = Std.hasImplicitInt(); // Set OpenCL Version. - Opts.OpenCL = Std.isOpenCL() || IK.getLanguage() == InputKind::OpenCL; + Opts.OpenCL = Std.isOpenCL(); if (LangStd == LangStandard::lang_opencl) Opts.OpenCLVersion = 100; else if (LangStd == LangStandard::lang_opencl11) @@ -1644,8 +1644,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, } } - Opts.CUDA = IK.getLanguage() == InputKind::CUDA || - LangStd == LangStandard::lang_cuda; + Opts.CUDA = IK.getLanguage() == InputKind::CUDA; if (Opts.CUDA) // Set default FP_CONTRACT to FAST. Opts.setDefaultFPContractMode(LangOptions::FPC_Fast); @@ -1701,23 +1700,20 @@ static bool IsInputCompatibleWithStandard(InputKind IK, case InputKind::C: case InputKind::ObjC: - // FIXME: Should this really allow OpenCL standards? - return S.isC89() || S.isC99(); + case InputKind::RenderScript: + return S.getLanguage() == InputKind::C; case InputKind::OpenCL: - return S.isOpenCL(); - - case InputKind::RenderScript: - // FIXME: Should this really allow -std=c++98 etc? - return true; + return S.getLanguage() == InputKind::OpenCL; case InputKind::CXX: case InputKind::ObjCXX: - // FIXME: Should this really allow -std=cuda? - return S.isCPlusPlus(); + return S.getLanguage() == InputKind::CXX; case InputKind::CUDA: - return S.isCPlusPlus(); + // FIXME: What -std= values should be permitted for CUDA compilations? + return S.getLanguage() == InputKind::CUDA || + S.getLanguage() == InputKind::CXX; case InputKind::Asm: // Accept (and ignore) all -std= values. @@ -1733,21 +1729,29 @@ static bool IsInputCompatibleWithStandard(InputKind IK, static const StringRef GetInputKindName(InputKind IK) { switch (IK.getLanguage()) { case InputKind::C: + return "C"; case InputKind::ObjC: - // FIXME: Don't lump these together. - return "C/ObjC"; + return "Objective-C"; case InputKind::CXX: + return "C++"; case InputKind::ObjCXX: - // FIXME: Don't lump these together. - return "C++/ObjC++"; + return "Objective-C++"; case InputKind::OpenCL: return "OpenCL"; case InputKind::CUDA: return "CUDA"; - // FIXME: Include names for other options, and make this switch exhaustive. - default: - llvm_unreachable("Cannot decide on name for InputKind!"); + case InputKind::RenderScript: + return "RenderScript"; + + case InputKind::Asm: + return "Asm"; + case InputKind::LLVM_IR: + return "LLVM IR"; + + case InputKind::Unknown: + break; } + llvm_unreachable("unknown input language"); } static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, @@ -1758,7 +1762,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, LangStandard::Kind LangStd = LangStandard::lang_unspecified; if (const Arg *A = Args.getLastArg(OPT_std_EQ)) { LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue()) -#define LANGSTANDARD(id, name, desc, features) \ +#define LANGSTANDARD(id, name, lang, desc, features) \ .Case(name, LangStandard::lang_##id) #define LANGSTANDARD_ALIAS(id, alias) \ .Case(alias, LangStandard::lang_##id) |