From b0fe70451e23a2b5ef19399d286c6a1cdaf5e686 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 26 Apr 2017 23:44:33 +0000 Subject: 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 --- clang/lib/Frontend/CompilerInvocation.cpp | 46 +++++++++++++++++-------------- 1 file changed, 25 insertions(+), 21 deletions(-) (limited to 'clang/lib/Frontend/CompilerInvocation.cpp') diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d74c659..dbbe6af 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(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) -- cgit v1.1