diff --git a/clang/include/clang/Basic/LangStandard.h b/clang/include/clang/Basic/LangStandard.h index 5cc1c7e0e397175a304329c9064ae03e9c75341a..6b15386e334eb936c016be54585e1cf8889929a9 100644 --- a/clang/include/clang/Basic/LangStandard.h +++ b/clang/include/clang/Basic/LangStandard.h @@ -41,9 +41,9 @@ enum class Language : uint8_t { RenderScript, HIP, HLSL, - #if ENABLE_BSC +#if ENABLE_BSC BSC, - #endif +#endif ///@} }; @@ -64,10 +64,6 @@ enum LangFeatures { HexFloat = (1 << 13), OpenCL = (1 << 14), HLSL = (1 << 15) -#if ENABLE_BSC - , - BSC = (1 << 16) -#endif }; /// LangStandard - Information about the properties of a particular language @@ -140,11 +136,6 @@ public: /// isOpenCL - Language is a OpenCL variant. bool isOpenCL() const { return Flags & OpenCL; } - #if ENABLE_BSC - /// isBSC - Language is a BiSheng C variant. - bool isBSC() const { return Flags & BSC; } - #endif - static Kind getLangKind(StringRef Name); static const LangStandard &getLangStandardForKind(Kind K); static const LangStandard *getLangStandardForName(StringRef Name); diff --git a/clang/include/clang/Basic/LangStandards.def b/clang/include/clang/Basic/LangStandards.def index f6d8a4afe8d4a85c6c83747e924aa03a4e6c8661..323032f41da02ef1d1bf531b7809f13f85835865 100644 --- a/clang/include/clang/Basic/LangStandards.def +++ b/clang/include/clang/Basic/LangStandards.def @@ -213,11 +213,6 @@ LANGSTANDARD(hlsl, "hlsl", HLSL, "High Level Shader Language", LineComment | HLSL | CPlusPlus ) -#if ENABLE_BSC -LANGSTANDARD(bsc, "bsc", BSC, "BiSheng C Language", - LineComment | BSC | C99 | C11 | C17 | Digraphs | GNUMode | HexFloat) -#endif - LANGSTANDARD(hlsl2015, "hlsl2015", HLSL, "High Level Shader Language 2015", LineComment | HLSL | CPlusPlus ) diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index a9346457c4719842c9d7be1a5b7947b506726bb4..e757a70909cb4299826c47a324358bb5c88e9266 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -94,6 +94,11 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, } else if (Lang == Language::ObjC || Lang == Language::ObjCXX) { Opts.ObjC = 1; } +#if ENABLE_BSC + else if (Lang == Language::BSC) { + Opts.BSC = 1; + } +#endif if (LangStd == LangStandard::lang_unspecified) LangStd = getDefaultLanguageStandard(Lang, T); @@ -104,9 +109,6 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, Opts.C11 = Std.isC11(); Opts.C17 = Std.isC17(); Opts.C2x = Std.isC2x(); - #if ENABLE_BSC - Opts.BSC = Std.isBSC(); - #endif Opts.CPlusPlus = Std.isCPlusPlus(); Opts.CPlusPlus11 = Std.isCPlusPlus11(); Opts.CPlusPlus14 = Std.isCPlusPlus14(); diff --git a/clang/lib/Basic/LangStandards.cpp b/clang/lib/Basic/LangStandards.cpp index 511bb953faaa9d82e8919341f1b1c46b3c44c1cc..d42be1205f1a635848f1070ecb070c1803c7aaa3 100644 --- a/clang/lib/Basic/LangStandards.cpp +++ b/clang/lib/Basic/LangStandards.cpp @@ -85,10 +85,13 @@ LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang, return LangStandard::lang_hip; case Language::HLSL: return LangStandard::lang_hlsl2021; - #if ENABLE_BSC +#if ENABLE_BSC case Language::BSC: - return LangStandard::lang_bsc; - #endif + if (CLANG_DEFAULT_STD_C != LangStandard::lang_unspecified) + return CLANG_DEFAULT_STD_C; + + return LangStandard::lang_gnu11; +#endif } llvm_unreachable("unhandled Language kind!"); } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 55b0018cacbe5d2a0d6de2b29e6087fcc4b47271..bdc8d1720df438f2b0de1dc7b2d3a97dc3985c1b 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3248,6 +3248,9 @@ static bool IsInputCompatibleWithStandard(InputKind IK, case Language::C: case Language::ObjC: case Language::RenderScript: +#if ENABLE_BSC + case Language::BSC: +#endif return S.getLanguage() == Language::C; case Language::OpenCL: @@ -3269,11 +3272,6 @@ static bool IsInputCompatibleWithStandard(InputKind IK, case Language::HIP: return S.getLanguage() == Language::CXX || S.getLanguage() == Language::HIP; - #if ENABLE_BSC - case Language::BSC: - return S.getLanguage() == Language::C || S.getLanguage() == Language::BSC; - #endif - case Language::Asm: // Accept (and ignore) all -std= values. // FIXME: The -std= value is not ignored; it affects the tokenization diff --git a/clang/test/BSC/Negative/Driver/options/std_option/std_option.cbs b/clang/test/BSC/Negative/Driver/options/std_option/std_option.cbs index d60bdae7ad7defa01022c741e6e39ec889f7ad1e..35931ad3e824a40c3565673aeb51d825f31f8e44 100644 --- a/clang/test/BSC/Negative/Driver/options/std_option/std_option.cbs +++ b/clang/test/BSC/Negative/Driver/options/std_option/std_option.cbs @@ -1,12 +1,10 @@ -// RUN: %clang_cc1 -std=c11 -verify %s -// RUN: %clang_cc1 -std=c89 -verify %s -// RUN: %clang_cc1 -std=c99 -verify %s -// RUN: %clang_cc1 -std=c17 -verify %s +// RUN: not %clang_cc1 -x bsc -std=c++11 -verify %s \ +// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-INVALID-OPTION + +// CHECK-INVALID-OPTION: (frontend): invalid argument '-std=c++11' not allowed with 'BSC' struct Foo { }; -// expected-error@+2 {{cannot combine with previous 'int' declaration specifier}} -// expected-error@+1 {{expected identifier or '('}} int struct Foo::getA(struct Foo* this) { return 1; } diff --git a/clang/test/BSC/Positive/Driver/options/std_option/std_option.cbs b/clang/test/BSC/Positive/Driver/options/std_option/std_option.cbs new file mode 100644 index 0000000000000000000000000000000000000000..bd7df7e2bae5a7a25cbf57f76e173ef99add0aa8 --- /dev/null +++ b/clang/test/BSC/Positive/Driver/options/std_option/std_option.cbs @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -std=c11 -verify %s +// RUN: %clang_cc1 -std=c89 -verify %s +// RUN: %clang_cc1 -std=c99 -verify %s +// RUN: %clang_cc1 -std=c17 -verify %s +// RUN: %clang_cc1 -std=gnu11 -verify %s +// RUN: %clang_cc1 -x bsc -std=c11 -verify %s +// RUN: %clang_cc1 -x bsc -std=c89 -verify %s +// RUN: %clang_cc1 -x bsc -std=c99 -verify %s +// RUN: %clang_cc1 -x bsc -std=c17 -verify %s +// RUN: %clang_cc1 -x bsc -std=gnu11 -verify %s +// expected-no-diagnostics + +struct Foo { +}; +int struct Foo::getA(struct Foo* this) { + return 1; +}