[clang] [HLSL] Add HLSL 202y language mode (PR #108437)
Chris B via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 13 10:53:36 PDT 2024
https://github.com/llvm-beanz updated https://github.com/llvm/llvm-project/pull/108437
>From 34cc492bad3f1b2b4cae7eb4dc5cbd4b219a8944 Mon Sep 17 00:00:00 2001
From: Chris Bieneman <chris.bieneman at me.com>
Date: Tue, 10 Sep 2024 10:24:08 -0500
Subject: [PATCH 1/2] [HLSL] Add HLSL 202y language mode
This change adds a new HLSL 202y language mode. Currently HLSL 202y is
planned to add `auto` and `constexpr`.
This change updates extension diagnostics to state that lambadas are a
"clang HLSL" extension (since we have no planned release yet to include
them), and that `auto` is a HLSL 202y extension when used in earlier
language modes.
Note: This PR does temporarily work around some differences between
HLSL 2021 and 202x in Clang by changing test cases to explicitly
specify 202x. A subsequent PR will update 2021's language flags to
match 202x.
---
clang/include/clang/Basic/DiagnosticGroups.td | 4 ++-
.../clang/Basic/DiagnosticParseKinds.td | 2 ++
.../clang/Basic/DiagnosticSemaKinds.td | 3 ++
clang/include/clang/Basic/LangOptions.h | 3 +-
clang/include/clang/Basic/LangStandards.def | 4 +++
clang/include/clang/Driver/Options.td | 2 +-
clang/lib/Basic/LangOptions.cpp | 2 ++
clang/lib/Basic/LangStandards.cpp | 1 +
clang/lib/Parse/ParseExprCXX.cpp | 2 ++
clang/lib/Sema/DeclSpec.cpp | 4 +++
clang/test/ParserHLSL/group_shared.hlsl | 10 +++----
clang/test/ParserHLSL/group_shared_202x.hlsl | 28 +++++++++++++------
clang/test/ParserHLSL/invalid_inside_cb.hlsl | 5 ++--
.../Preprocessor/predefined-macros-hlsl.hlsl | 5 +++-
clang/test/SemaHLSL/group_shared.hlsl | 7 +++--
clang/test/SemaHLSL/group_shared_202x.hlsl | 27 ++++++++++++------
16 files changed, 77 insertions(+), 32 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td
index 116ce7a04f66f7..e250f81a0b52a5 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1535,8 +1535,10 @@ def PedanticMacros : DiagGroup<"pedantic-macros",
def BranchProtection : DiagGroup<"branch-protection">;
// HLSL diagnostic groups
+def HLSL202y : DiagGroup<"hlsl-202y-extensions">;
+
// Warnings for HLSL Clang extensions
-def HLSLExtension : DiagGroup<"hlsl-extensions">;
+def HLSLExtension : DiagGroup<"hlsl-extensions", [HLSL202y]>;
// Warning for mix packoffset and non-packoffset.
def HLSLMixPackOffset : DiagGroup<"mix-packoffset">;
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 0aa2c4a70849a8..479843867716c8 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1790,5 +1790,7 @@ def ext_hlsl_access_specifiers : ExtWarn<
InGroup<HLSLExtension>;
def err_hlsl_unsupported_component : Error<"invalid component '%0' used; expected 'x', 'y', 'z', or 'w'">;
def err_hlsl_packoffset_invalid_reg : Error<"invalid resource class specifier '%0' for packoffset, expected 'c'">;
+def ext_hlsl_lambda : ExtWarn<"lambdas are a clang HLSL extension">,
+ InGroup<HLSLExtension>;
} // end of Parser diagnostics
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index efdc058edca56d..50eb15ab6ad1af 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12397,6 +12397,9 @@ def warn_attr_min_eq_max: Warning<
def err_hlsl_attribute_number_arguments_insufficient_shader_model: Error<
"attribute %0 with %1 arguments requires shader model %2 or greater">;
+def ext_hlsl_auto_type_specifier : ExtWarn<
+ "'auto' type specifier is a HLSL 202y extension">, InGroup<HLSL202y>;
+
// Layout randomization diagnostics.
def err_non_designated_init_used : Error<
"a randomized struct can only be initialized with a designated initializer">;
diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h
index 51a34686ad7e1d..6c186c410e158d 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -160,7 +160,8 @@ class LangOptionsBase {
HLSL_2017 = 2017,
HLSL_2018 = 2018,
HLSL_2021 = 2021,
- HLSL_202x = 2029,
+ HLSL_202x = 2028,
+ HLSL_202y = 2029,
};
/// Clang versions with different platform ABI conformance.
diff --git a/clang/include/clang/Basic/LangStandards.def b/clang/include/clang/Basic/LangStandards.def
index f0c259307ac4e7..41e756d9365dcf 100644
--- a/clang/include/clang/Basic/LangStandards.def
+++ b/clang/include/clang/Basic/LangStandards.def
@@ -256,6 +256,10 @@ LANGSTANDARD(hlsl202x, "hlsl202x",
HLSL, "High Level Shader Language 202x",
LineComment | HLSL | CPlusPlus | CPlusPlus11)
+LANGSTANDARD(hlsl202y, "hlsl202y",
+ HLSL, "High Level Shader Language 202y",
+ LineComment | HLSL | CPlusPlus | CPlusPlus11)
+
#undef LANGSTANDARD
#undef LANGSTANDARD_ALIAS
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index f78032255f036f..54938db9d9f885 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -8914,7 +8914,7 @@ def dxc_hlsl_version : Option<["/", "-"], "HV", KIND_JOINED_OR_SEPARATE>,
Group<dxc_Group>,
Visibility<[DXCOption]>,
HelpText<"HLSL Version">,
- Values<"2016, 2017, 2018, 2021, 202x">;
+ Values<"2016, 2017, 2018, 2021, 202x, 202y">;
def dxc_validator_path_EQ : Joined<["--"], "dxv-path=">, Group<dxc_Group>,
HelpText<"DXIL validator installation path">;
def dxc_disable_validation : DXCFlag<"Vd">,
diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp
index 9331a63d91b173..da3216ae03af2e 100644
--- a/clang/lib/Basic/LangOptions.cpp
+++ b/clang/lib/Basic/LangOptions.cpp
@@ -159,6 +159,8 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang,
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2021;
else if (LangStd == LangStandard::lang_hlsl202x)
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_202x;
+ else if (LangStd == LangStandard::lang_hlsl202y)
+ Opts.HLSLVersion = (unsigned)LangOptions::HLSL_202y;
// OpenCL has some additional defaults.
if (Opts.OpenCL) {
diff --git a/clang/lib/Basic/LangStandards.cpp b/clang/lib/Basic/LangStandards.cpp
index c8c9292abcb22b..b9b914b0adc772 100644
--- a/clang/lib/Basic/LangStandards.cpp
+++ b/clang/lib/Basic/LangStandards.cpp
@@ -78,6 +78,7 @@ LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) {
.Case("2018", LangStandard::lang_hlsl2018)
.Case("2021", LangStandard::lang_hlsl2021)
.Case("202x", LangStandard::lang_hlsl202x)
+ .Case("202y", LangStandard::lang_hlsl202y)
.Default(LangStandard::lang_unspecified);
}
diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp
index 9bb0fff329d728..b9f226672fc91c 100644
--- a/clang/lib/Parse/ParseExprCXX.cpp
+++ b/clang/lib/Parse/ParseExprCXX.cpp
@@ -1347,6 +1347,8 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
Diag(LambdaBeginLoc, getLangOpts().CPlusPlus11
? diag::warn_cxx98_compat_lambda
: diag::ext_lambda);
+ if (getLangOpts().HLSL)
+ Diag(LambdaBeginLoc, diag::ext_hlsl_lambda);
PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), LambdaBeginLoc,
"lambda expression parsing");
diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp
index 5272786a92092f..f2fb4ec9bb4f52 100644
--- a/clang/lib/Sema/DeclSpec.cpp
+++ b/clang/lib/Sema/DeclSpec.cpp
@@ -1419,6 +1419,10 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {
if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().C23 &&
TypeSpecType == TST_auto)
S.Diag(TSTLoc, diag::ext_auto_type_specifier);
+ if (S.getLangOpts().HLSL &&
+ S.getLangOpts().getHLSLVersion() < LangOptions::HLSL_202y &&
+ TypeSpecType == TST_auto)
+ S.Diag(TSTLoc, diag::ext_hlsl_auto_type_specifier);
if (S.getLangOpts().CPlusPlus && !S.getLangOpts().CPlusPlus11 &&
StorageClassSpec == SCS_auto)
S.Diag(StorageClassSpecLoc, diag::warn_auto_storage_class)
diff --git a/clang/test/ParserHLSL/group_shared.hlsl b/clang/test/ParserHLSL/group_shared.hlsl
index 44f3a2e5b4505d..6e8e12c94f226d 100644
--- a/clang/test/ParserHLSL/group_shared.hlsl
+++ b/clang/test/ParserHLSL/group_shared.hlsl
@@ -1,12 +1,12 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -std=hlsl202x -o - -fsyntax-only %s -verify
extern groupshared float f;
extern float groupshared f; // Ok, redeclaration?
-// expected-warning at +3 {{lambdas are a C++11 extension}}
-// expected-error at +2 {{expected body of lambda expression}}
-// expected-warning at +1 {{'auto' type specifier is a C++11 extension}}
-auto l = []() groupshared {};
+// expected-warning@#gs_lambda {{lambdas are a clang HLSL extension}}
+// expected-error@#gs_lambda {{expected body of lambda expression}}
+// expected-warning@#gs_lambda {{'auto' type specifier is a HLSL 202y extension}}
+auto l = []() groupshared {}; // #gs_lambda
float groupshared [[]] i = 12;
diff --git a/clang/test/ParserHLSL/group_shared_202x.hlsl b/clang/test/ParserHLSL/group_shared_202x.hlsl
index 517ed3949a13d5..bbbb5e75b9fe18 100644
--- a/clang/test/ParserHLSL/group_shared_202x.hlsl
+++ b/clang/test/ParserHLSL/group_shared_202x.hlsl
@@ -2,10 +2,14 @@
extern groupshared float f;
extern float groupshared f; // Ok, redeclaration?
-// expected-error at +1 {{return type cannot be qualified with address space}}
-auto l = []() -> groupshared void {};
-// expected-error at +1 {{expected a type}}
-auto l2 = []() -> groupshared {};
+// expected-error@#l {{return type cannot be qualified with address space}}
+// expected-warning@#l {{lambdas are a clang HLSL extension}}
+// expected-warning@#l{{'auto' type specifier is a HLSL 202y extension}}
+auto l = []() -> groupshared void {}; // #l
+// expected-error@#l2 {{expected a type}}
+// expected-warning@#l2 {{lambdas are a clang HLSL extension}}
+// expected-warning@#l2{{'auto' type specifier is a HLSL 202y extension}}
+auto l2 = []() -> groupshared {}; // #l2
float groupshared [[]] i = 12;
@@ -17,13 +21,19 @@ void foo() {
extern groupshared float f;
const float cf = f;
-// expected-error at +1 {{'auto' return without trailing return type; deduced return types are a C++14 extension}}
-auto func() {
+// expected-error@#func{{'auto' return without trailing return type; deduced return types are a C++14 extension}}
+// expected-warning@#func{{'auto' type specifier is a HLSL 202y extension}}
+auto func() { // #func
return f;
}
void other() {
- // NOTE: groupshared and const are stripped off thanks to lvalue to rvalue conversions and we deduce float for the return type.
- auto l = [&]() { return f; };
- auto l2 = [&]() { return cf; };
+ // NOTE: groupshared and const are stripped off thanks to lvalue to rvalue
+ // conversions and we deduce float for the return type.
+ // expected-warning@#local{{lambdas are a clang HLSL extension}}
+ // expected-warning@#local{{'auto' type specifier is a HLSL 202y extension}}
+ auto l = [&]() { return f; }; // #local
+ // expected-warning@#local2{{lambdas are a clang HLSL extension}}
+ // expected-warning@#local2{{'auto' type specifier is a HLSL 202y extension}}
+ auto l2 = [&]() { return cf; }; // #local2
}
diff --git a/clang/test/ParserHLSL/invalid_inside_cb.hlsl b/clang/test/ParserHLSL/invalid_inside_cb.hlsl
index af35a301c21e76..b74021fd22422d 100644
--- a/clang/test/ParserHLSL/invalid_inside_cb.hlsl
+++ b/clang/test/ParserHLSL/invalid_inside_cb.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -std=hlsl202x -o - -fsyntax-only %s -verify
// template not allowed inside cbuffer.
cbuffer A {
@@ -15,7 +15,6 @@ cbuffer A {
// typealias not allowed inside cbuffer.
cbuffer A {
- // expected-error at +2 {{invalid declaration inside cbuffer}}
- // expected-warning at +1 {{alias declarations are a C++11 extension}}
+ // expected-error at +1 {{invalid declaration inside cbuffer}}
using F32 = float;
}
diff --git a/clang/test/Preprocessor/predefined-macros-hlsl.hlsl b/clang/test/Preprocessor/predefined-macros-hlsl.hlsl
index cc5233fbcb2aca..bc3779e4129f0d 100644
--- a/clang/test/Preprocessor/predefined-macros-hlsl.hlsl
+++ b/clang/test/Preprocessor/predefined-macros-hlsl.hlsl
@@ -50,4 +50,7 @@
// STD2021: #define __HLSL_VERSION 2021
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library %s -E -dM -o - -x hlsl -std=hlsl202x | FileCheck -match-full-lines %s --check-prefixes=STD202x
-// STD202x: #define __HLSL_VERSION 2029
+// STD202x: #define __HLSL_VERSION 2028
+
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library %s -E -dM -o - -x hlsl -std=hlsl202y | FileCheck -match-full-lines %s --check-prefixes=STD202y
+// STD202y: #define __HLSL_VERSION 2029
diff --git a/clang/test/SemaHLSL/group_shared.hlsl b/clang/test/SemaHLSL/group_shared.hlsl
index 67450fe533ebba..b51114700b041d 100644
--- a/clang/test/SemaHLSL/group_shared.hlsl
+++ b/clang/test/SemaHLSL/group_shared.hlsl
@@ -72,9 +72,10 @@ groupshared void (*fp)();
// expected-error at +1 {{parameter may not be qualified with an address space}}
void (*fp2)(groupshared float);
// NOTE: HLSL not support trailing return types.
-// expected-warning at +2 {{'auto' type specifier is a C++11 extension}}
-// expected-error at +1 {{expected function body after function declarator}}
-auto func() -> groupshared void;
+// expected-warning@#func{{'auto' type specifier is a HLSL 202y extension}}
+// expected-warning@#func {{'auto' type specifier is a C++11 extension}}
+// expected-error@#func {{expected function body after function declarator}}
+auto func() -> groupshared void; // #func
// expected-warning at +2 {{'groupshared' attribute only applies to variables}}
// expected-error at +1 {{return type cannot be qualified with address space}}
void groupshared f();
diff --git a/clang/test/SemaHLSL/group_shared_202x.hlsl b/clang/test/SemaHLSL/group_shared_202x.hlsl
index 97b927a5976ed5..7ebc717384e945 100644
--- a/clang/test/SemaHLSL/group_shared_202x.hlsl
+++ b/clang/test/SemaHLSL/group_shared_202x.hlsl
@@ -1,16 +1,27 @@
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -std=hlsl202x -o - -fsyntax-only %s -verify
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -std=hlsl202y -o - -fsyntax-only %s -verify
-// expected-error at +1 {{return type cannot be qualified with address space}}
-auto func() -> groupshared void;
+#if __HLSL_VERSION < 2029
+// expected-warning@#func{{'auto' type specifier is a HLSL 202y extension}}
+// expected-warning@#func_gs{{'auto' type specifier is a HLSL 202y extension}}
+// expected-warning@#l{{'auto' type specifier is a HLSL 202y extension}}
+// expected-warning@#l2{{'auto' type specifier is a HLSL 202y extension}}
+#endif
-// expected-error at +1 {{parameter may not be qualified with an address space}}
-auto func(float groupshared) -> void;
+// expected-error@#func {{return type cannot be qualified with address space}}
+auto func() -> groupshared void; // #func
-// expected-error at +1 {{parameter may not be qualified with an address space}}
-auto l = [](groupshared float ) {};
+// expected-error@#func_gs {{parameter may not be qualified with an address space}}
+auto func(float groupshared) -> void; // #func_gs
-// expected-error at +1 {{return type cannot be qualified with address space}}
-auto l2 = []() -> groupshared void {};
+
+// expected-error@#l {{parameter may not be qualified with an address space}}
+// expected-warning@#l {{lambdas are a clang HLSL extension}}
+auto l = [](groupshared float ) {}; // #l
+
+// expected-error@#l2 {{return type cannot be qualified with address space}}
+// expected-warning@#l2 {{lambdas are a clang HLSL extension}}
+auto l2 = []() -> groupshared void {}; // #l2
struct S {
// expected-error at +1 {{return type cannot be qualified with address space}}
>From 6be47f9c5ec77d0ae2c76b33a466fd912d94b000 Mon Sep 17 00:00:00 2001
From: Chris Bieneman <chris.bieneman at me.com>
Date: Fri, 13 Sep 2024 12:53:11 -0500
Subject: [PATCH 2/2] Update diagnostics to share string
---
clang/include/clang/Basic/DiagnosticParseKinds.td | 7 ++++---
clang/include/clang/Basic/DiagnosticSemaKinds.td | 8 ++++----
clang/lib/Parse/ParseExprCXX.cpp | 10 ++++++----
clang/lib/Sema/DeclSpec.cpp | 4 ++--
4 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 479843867716c8..fec2456d6f4497 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1073,7 +1073,10 @@ def err_expected_lambda_body : Error<"expected body of lambda expression">;
def warn_cxx98_compat_lambda : Warning<
"lambda expressions are incompatible with C++98">,
InGroup<CXX98Compat>, DefaultIgnore;
-def ext_lambda : ExtWarn<"lambdas are a C++11 extension">, InGroup<CXX11>;
+def ext_lambda : ExtWarn<"lambdas are a %select{C++11|clang HLSL}0 extension">,
+ InGroup<CXX11>;
+def ext_hlsl_lambda : ExtWarn<ext_lambda.Summary>,
+ InGroup<HLSLExtension>;
def err_lambda_decl_specifier_repeated : Error<
"%select{'mutable'|'static'|'constexpr'|'consteval'}0 cannot "
"appear multiple times in a lambda declarator">;
@@ -1790,7 +1793,5 @@ def ext_hlsl_access_specifiers : ExtWarn<
InGroup<HLSLExtension>;
def err_hlsl_unsupported_component : Error<"invalid component '%0' used; expected 'x', 'y', 'z', or 'w'">;
def err_hlsl_packoffset_invalid_reg : Error<"invalid resource class specifier '%0' for packoffset, expected 'c'">;
-def ext_hlsl_lambda : ExtWarn<"lambdas are a clang HLSL extension">,
- InGroup<HLSLExtension>;
} // end of Parser diagnostics
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 50eb15ab6ad1af..00f211ac79a3f0 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -267,7 +267,10 @@ def err_invalid_width_spec : Error<
def err_invalid_complex_spec : Error<"'_Complex %0' is invalid">;
def ext_auto_type_specifier : ExtWarn<
- "'auto' type specifier is a C++11 extension">, InGroup<CXX11>;
+ "'auto' type specifier is a %select{C++11|HLSL 202y}0 extension">,
+ InGroup<CXX11>;
+def ext_hlsl_auto_type_specifier : ExtWarn<
+ ext_auto_type_specifier.Summary>, InGroup<HLSL202y>;
def warn_auto_storage_class : Warning<
"'auto' storage class specifier is redundant and incompatible with C++11">,
InGroup<CXX11Compat>, DefaultIgnore;
@@ -12397,9 +12400,6 @@ def warn_attr_min_eq_max: Warning<
def err_hlsl_attribute_number_arguments_insufficient_shader_model: Error<
"attribute %0 with %1 arguments requires shader model %2 or greater">;
-def ext_hlsl_auto_type_specifier : ExtWarn<
- "'auto' type specifier is a HLSL 202y extension">, InGroup<HLSL202y>;
-
// Layout randomization diagnostics.
def err_non_designated_init_used : Error<
"a randomized struct can only be initialized with a designated initializer">;
diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp
index b9f226672fc91c..e96cddf88a1346 100644
--- a/clang/lib/Parse/ParseExprCXX.cpp
+++ b/clang/lib/Parse/ParseExprCXX.cpp
@@ -1344,11 +1344,13 @@ static void DiagnoseStaticSpecifierRestrictions(Parser &P,
ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
LambdaIntroducer &Intro) {
SourceLocation LambdaBeginLoc = Intro.Range.getBegin();
- Diag(LambdaBeginLoc, getLangOpts().CPlusPlus11
- ? diag::warn_cxx98_compat_lambda
- : diag::ext_lambda);
if (getLangOpts().HLSL)
- Diag(LambdaBeginLoc, diag::ext_hlsl_lambda);
+ Diag(LambdaBeginLoc, diag::ext_hlsl_lambda) << /*HLSL*/ 1;
+ else
+ Diag(LambdaBeginLoc, getLangOpts().CPlusPlus11
+ ? diag::warn_cxx98_compat_lambda
+ : diag::ext_lambda)
+ << /*C++*/ 0;
PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), LambdaBeginLoc,
"lambda expression parsing");
diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp
index f2fb4ec9bb4f52..12d2d3f6060c63 100644
--- a/clang/lib/Sema/DeclSpec.cpp
+++ b/clang/lib/Sema/DeclSpec.cpp
@@ -1418,11 +1418,11 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {
// specifier in a pre-C++11 dialect of C++ or in a pre-C23 dialect of C.
if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().C23 &&
TypeSpecType == TST_auto)
- S.Diag(TSTLoc, diag::ext_auto_type_specifier);
+ S.Diag(TSTLoc, diag::ext_auto_type_specifier) << /*C++*/ 0;
if (S.getLangOpts().HLSL &&
S.getLangOpts().getHLSLVersion() < LangOptions::HLSL_202y &&
TypeSpecType == TST_auto)
- S.Diag(TSTLoc, diag::ext_hlsl_auto_type_specifier);
+ S.Diag(TSTLoc, diag::ext_hlsl_auto_type_specifier) << /*HLSL*/ 1;
if (S.getLangOpts().CPlusPlus && !S.getLangOpts().CPlusPlus11 &&
StorageClassSpec == SCS_auto)
S.Diag(StorageClassSpecLoc, diag::warn_auto_storage_class)
More information about the cfe-commits
mailing list