Skip to content

Commit 94d0605

Browse files
author
git apple-llvm automerger
committed
Merge commit '70f1307f2708' from swift/release/5.9 into stable/20221013
2 parents 91080e6 + 70f1307 commit 94d0605

File tree

10 files changed

+89
-8
lines changed

10 files changed

+89
-8
lines changed

lldb/include/lldb/lldb-enumerations.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,13 +476,25 @@ enum LanguageType {
476476
eLanguageTypeC_plus_plus_14 = 0x0021, ///< ISO C++:2014.
477477
eLanguageTypeFortran03 = 0x0022, ///< ISO Fortran 2003.
478478
eLanguageTypeFortran08 = 0x0023, ///< ISO Fortran 2008.
479+
eLanguageTypeRenderScript = 0x0024,
480+
eLanguageTypeBLISS = 0x0025,
481+
eLanguageTypeKotlin = 0x0026,
482+
eLanguageTypeZig = 0x0027,
483+
eLanguageTypeCrystal = 0x0028,
484+
eLanguageTypeC_plus_plus_17 = 0x002a, ///< ISO C++:2017.
485+
eLanguageTypeC_plus_plus_20 = 0x002b, ///< ISO C++:2020.
486+
eLanguageTypeC17 = 0x002c,
487+
eLanguageTypeFortran18 = 0x002d,
488+
eLanguageTypeAda2005 = 0x002e,
489+
eLanguageTypeAda2012 = 0x002f,
490+
479491
// Vendor Extensions
480492
// Note: Language::GetNameForLanguageType
481493
// assumes these can be used as indexes into array language_names, and
482494
// Language::SetLanguageFromCString and Language::AsCString assume these can
483495
// be used as indexes into array g_languages.
484-
eLanguageTypeMipsAssembler = 0x0024, ///< Mips_Assembler.
485-
eLanguageTypeExtRenderScript = 0x0025, ///< RenderScript.
496+
eLanguageTypeMipsAssembler, ///< Mips_Assembler.
497+
eLanguageTypeExtRenderScript, ///< GOOGLE_RenderScript.
486498
eNumLanguageTypes
487499
};
488500

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,16 @@ ClangExpressionParser::ClangExpressionParser(
541541
// be re-evaluated in the future.
542542
lang_opts.CPlusPlus11 = true;
543543
break;
544+
case lldb::eLanguageTypeC_plus_plus_20:
545+
lang_opts.CPlusPlus20 = true;
546+
LLVM_FALLTHROUGH;
547+
case lldb::eLanguageTypeC_plus_plus_17:
548+
// FIXME: add a separate case for CPlusPlus14. Currently folded into C++17
549+
// because C++14 is the default standard for Clang but enabling CPlusPlus14
550+
// expression evaluatino doesn't pass the test-suite cleanly.
551+
lang_opts.CPlusPlus14 = true;
552+
lang_opts.CPlusPlus17 = true;
553+
LLVM_FALLTHROUGH;
544554
case lldb::eLanguageTypeC_plus_plus:
545555
case lldb::eLanguageTypeC_plus_plus_11:
546556
case lldb::eLanguageTypeC_plus_plus_14:

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ TokenVerifier::TokenVerifier(std::string body) {
262262
LangOptions Opts;
263263
Opts.ObjC = true;
264264
Opts.DollarIdents = true;
265-
Opts.CPlusPlus17 = true;
265+
Opts.CPlusPlus20 = true;
266266
Opts.LineComment = true;
267267

268268
Lexer lex(FID, buf->getMemBufferRef(), SM, Opts);

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,7 @@ static const clang::LangOptions &GetLangOptions() {
706706
g_options.CPlusPlus11 = true;
707707
g_options.CPlusPlus14 = true;
708708
g_options.CPlusPlus17 = true;
709+
g_options.CPlusPlus20 = true;
709710
});
710711
return g_options;
711712
}

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ bool TypeSystemClang::IsOperator(llvm::StringRef name,
399399
.Case("=", clang::OO_Equal)
400400
.Case("==", clang::OO_EqualEqual)
401401
.Case("<", clang::OO_Less)
402+
.Case("<=>", clang::OO_Spaceship)
402403
.Case("<<", clang::OO_LessLess)
403404
.Case("<<=", clang::OO_LessLessEqual)
404405
.Case("<=", clang::OO_LessEqual)
@@ -510,6 +511,9 @@ static void ParseLangArgs(LangOptions &Opts, InputKind IK, const char *triple) {
510511
Opts.C99 = Std.isC99();
511512
Opts.CPlusPlus = Std.isCPlusPlus();
512513
Opts.CPlusPlus11 = Std.isCPlusPlus11();
514+
Opts.CPlusPlus14 = Std.isCPlusPlus14();
515+
Opts.CPlusPlus17 = Std.isCPlusPlus17();
516+
Opts.CPlusPlus20 = Std.isCPlusPlus20();
513517
Opts.Digraphs = Std.hasDigraphs();
514518
Opts.GNUMode = Std.isGNUMode();
515519
Opts.GNUInline = !Std.isC99();
@@ -628,6 +632,8 @@ LanguageSet TypeSystemClang::GetSupportedLanguagesForTypes() {
628632
languages.Insert(lldb::eLanguageTypeC_plus_plus_11);
629633
languages.Insert(lldb::eLanguageTypeC11);
630634
languages.Insert(lldb::eLanguageTypeC_plus_plus_14);
635+
languages.Insert(lldb::eLanguageTypeC_plus_plus_17);
636+
languages.Insert(lldb::eLanguageTypeC_plus_plus_20);
631637
return languages;
632638
}
633639

@@ -638,6 +644,8 @@ LanguageSet TypeSystemClang::GetSupportedLanguagesForExpressions() {
638644
languages.Insert(lldb::eLanguageTypeC_plus_plus_03);
639645
languages.Insert(lldb::eLanguageTypeC_plus_plus_11);
640646
languages.Insert(lldb::eLanguageTypeC_plus_plus_14);
647+
languages.Insert(lldb::eLanguageTypeC_plus_plus_17);
648+
languages.Insert(lldb::eLanguageTypeC_plus_plus_20);
641649
return languages;
642650
}
643651

lldb/source/Target/Language.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,21 @@ struct language_name_pair language_names[] = {
194194
{"c++14", eLanguageTypeC_plus_plus_14},
195195
{"fortran03", eLanguageTypeFortran03},
196196
{"fortran08", eLanguageTypeFortran08},
197+
{"renderscript", eLanguageTypeRenderScript},
198+
{"bliss", eLanguageTypeBLISS},
199+
{"kotlin", eLanguageTypeKotlin},
200+
{"zig", eLanguageTypeZig},
201+
{"crystal", eLanguageTypeCrystal},
202+
{"<invalid language>",
203+
static_cast<LanguageType>(
204+
0x0029)}, // Not yet taken by any language in the DWARF spec
205+
// and thus has no entry in LanguageType
206+
{"c++17", eLanguageTypeC_plus_plus_17},
207+
{"c++20", eLanguageTypeC_plus_plus_20},
208+
{"c17", eLanguageTypeC17},
209+
{"fortran18", eLanguageTypeFortran18},
210+
{"ada2005", eLanguageTypeAda2005},
211+
{"ada2012", eLanguageTypeAda2012},
197212
// Vendor Extensions
198213
{"assembler", eLanguageTypeMipsAssembler},
199214
{"renderscript", eLanguageTypeExtRenderScript},
@@ -242,6 +257,8 @@ bool Language::LanguageIsCPlusPlus(LanguageType language) {
242257
case eLanguageTypeC_plus_plus_03:
243258
case eLanguageTypeC_plus_plus_11:
244259
case eLanguageTypeC_plus_plus_14:
260+
case eLanguageTypeC_plus_plus_17:
261+
case eLanguageTypeC_plus_plus_20:
245262
case eLanguageTypeObjC_plus_plus:
246263
return true;
247264
default:
@@ -281,6 +298,8 @@ bool Language::LanguageIsCFamily(LanguageType language) {
281298
case eLanguageTypeC_plus_plus_03:
282299
case eLanguageTypeC_plus_plus_11:
283300
case eLanguageTypeC_plus_plus_14:
301+
case eLanguageTypeC_plus_plus_17:
302+
case eLanguageTypeC_plus_plus_20:
284303
case eLanguageTypeObjC_plus_plus:
285304
case eLanguageTypeObjC:
286305
return true;
@@ -304,6 +323,8 @@ LanguageType Language::GetPrimaryLanguage(LanguageType language) {
304323
case eLanguageTypeC_plus_plus_03:
305324
case eLanguageTypeC_plus_plus_11:
306325
case eLanguageTypeC_plus_plus_14:
326+
case eLanguageTypeC_plus_plus_17:
327+
case eLanguageTypeC_plus_plus_20:
307328
return eLanguageTypeC_plus_plus;
308329
case eLanguageTypeC:
309330
case eLanguageTypeC89:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CXX_SOURCES := main.cpp
2+
CXXFLAGS_EXTRAS := -std=c++20
3+
4+
include Makefile.rules
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import lldb
2+
from lldbsuite.test.decorators import *
3+
from lldbsuite.test.lldbtest import *
4+
from lldbsuite.test import lldbutil
5+
6+
class TestCPP20Standard(TestBase):
7+
def test_cpp20(self):
8+
"""
9+
Tests that we can evaluate an expression in C++20 mode
10+
"""
11+
self.build()
12+
lldbutil.run_to_source_breakpoint(self, "Foo{}", lldb.SBFileSpec("main.cpp"))
13+
14+
self.expect("expr -l c++11 -- Foo{} <=> Foo{}", error=True, substrs=["'<=>' is a single token in C++20; add a space to avoid a change in behavior"])
15+
16+
self.expect("expr -l c++20 -- Foo{} <=> Foo{}", substrs=["(bool) $0 = true"])
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include <compare>
2+
3+
struct Foo {
4+
friend auto operator<=>(Foo const &, Foo const &) { return true; }
5+
};
6+
7+
int main() { return Foo{} <=> Foo{}; }

lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,11 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
181181

182182
{"auto Foo[abi:abc]<int>::operator<<<Foo[abi:abc]<int>>(int) &",
183183
"Foo[abi:abc]<int>", "operator<<<Foo[abi:abc]<int>>", "(int)", "&",
184-
"Foo[abi:abc]<int>::operator<<<Foo[abi:abc]<int>>"}};
184+
"Foo[abi:abc]<int>::operator<<<Foo[abi:abc]<int>>"},
185+
186+
{"auto A::operator<=>[abi:tag]<A::B>()", "A",
187+
"operator<=>[abi:tag]<A::B>", "()", "",
188+
"A::operator<=>[abi:tag]<A::B>"}};
185189

186190
for (const auto &test : test_cases) {
187191
CPlusPlusLanguage::MethodName method(ConstString(test.input));
@@ -202,7 +206,6 @@ TEST(CPlusPlusLanguage, InvalidMethodNameParsing) {
202206
std::string test_cases[] = {
203207
"int Foo::operator[]<[10>()",
204208
"Foo::operator bool[10]()",
205-
"auto A::operator<=>[abi:tag]<A::B>()",
206209
"auto A::operator<<<(int)",
207210
"auto A::operator>>>(int)",
208211
"auto A::operator<<<Type[abi:tag]<>(int)",
@@ -331,10 +334,9 @@ TEST(CPlusPlusLanguage, ExtractContextAndIdentifier) {
331334
EXPECT_FALSE(CPlusPlusLanguage::ExtractContextAndIdentifier(
332335
"f<A<B><C>>", context, basename));
333336

334-
// We expect these cases to fail until we turn on C++2a
335-
EXPECT_FALSE(CPlusPlusLanguage::ExtractContextAndIdentifier(
337+
EXPECT_TRUE(CPlusPlusLanguage::ExtractContextAndIdentifier(
336338
"A::operator<=><A::B>", context, basename));
337-
EXPECT_FALSE(CPlusPlusLanguage::ExtractContextAndIdentifier(
339+
EXPECT_TRUE(CPlusPlusLanguage::ExtractContextAndIdentifier(
338340
"operator<=><A::B>", context, basename));
339341
}
340342

0 commit comments

Comments
 (0)