clang: include/clang/Parse/Parser.h Source File (original) (raw)

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195public:

200

203

209

212

214 return Actions.incrementMSManglingNumber();

215 }

216

217

218

221

222

223

225

226

227

228

229

230

231

232

233

234

235

236

237

240

241

242

243

244

245

246

247

248

256

257

258

259

260

261

263 assert(!isTokenSpecial() &&

264 "Should consume special tokens with Consume*Token");

265 PrevTokLocation = Tok.getLocation();

266 PP.Lex(Tok);

267 return PrevTokLocation;

268 }

269

272 return false;

273 assert(!isTokenSpecial() &&

274 "Should consume special tokens with Consume*Token");

275 PrevTokLocation = Tok.getLocation();

276 PP.Lex(Tok);

277 return true;

278 }

279

282 return false;

283 Loc = PrevTokLocation;

284 return true;

285 }

286

287

288

289

291 if (isTokenParen())

292 return ConsumeParen();

293 if (isTokenBracket())

294 return ConsumeBracket();

295 if (isTokenBrace())

296 return ConsumeBrace();

297 if (isTokenStringLiteral())

298 return ConsumeStringToken();

299 if (Tok.is(tok::code_completion))

300 return ConsumeCodeCompletionTok ? ConsumeCodeCompletionToken()

301 : handleUnexpectedCodeCompletionToken();

302 if (Tok.isAnnotation())

303 return ConsumeAnnotationToken();

305 }

306

308

309

310

311

312

313

314

315

317 if (N == 0 || Tok.is(tok::eof))

318 return Tok;

319 return PP.LookAhead(N - 1);

320 }

321

322

323

325

326

328 if (!Tok.getAnnotationValue())

331 }

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356 bool

359

360

361

362

366

367

368

369

370

371

372

373

375

378 (Tok.is(tok::identifier) || Tok.is(tok::coloncolon) ||

379 (Tok.is(tok::annot_template_id) &&

381 Tok.is(tok::kw_decltype) || Tok.is(tok::kw___super));

382 }

386

387

388

389

390

391

392

393

394

395

396 class ParseScope {

398 ParseScope(const ParseScope &) = delete;

399 void operator=(const ParseScope &) = delete;

400

401 public:

402

403

404

406 bool BeforeCompoundStmt = false)

407 : Self(Self) {

408 if (EnteredScope && !BeforeCompoundStmt)

409 Self->EnterScope(ScopeFlags);

410 else {

411 if (BeforeCompoundStmt)

412 Self->incrementMSManglingNumber();

413

414 this->Self = nullptr;

415 }

416 }

417

418

419

421 if (Self) {

422 Self->ExitScope();

423 Self = nullptr;

424 }

425 }

426

428 };

429

430

431

432 class MultiParseScope {

434 unsigned NumScopes = 0;

435

436 MultiParseScope(const MultiParseScope &) = delete;

437

438 public:

440 void Enter(unsigned ScopeFlags) {

441 Self.EnterScope(ScopeFlags);

442 ++NumScopes;

443 }

445 while (NumScopes) {

446 Self.ExitScope();

447 --NumScopes;

448 }

449 }

451 };

452

453

454 void EnterScope(unsigned ScopeFlags);

455

456

458

459

460

461

465

471

472

479

482 return static_cast<SkipUntilFlags>(static_cast<unsigned>(L) |

483 static_cast<unsigned>(R));

484 }

485

486

487

488

489

490

491

492

493

494

509

510

511

512

513

514

515

516

517

520

521private:

523

524

525

527

528

529

530

531

533

534

535

537

538 unsigned short ParenCount = 0, BracketCount = 0, BraceCount = 0;

539 unsigned short MisplacedModuleBeginCount = 0;

540

541

542

543 Sema &Actions;

544

546

548

549

550 static constexpr int ScopeCacheSize = 16;

551 unsigned NumCachedScopes;

552 Scope *ScopeCache[ScopeCacheSize];

553

554

555

556

557 IdentifierInfo *Ident__exception_code, *Ident___exception_code,

558 *Ident_GetExceptionCode;

559

560 IdentifierInfo *Ident__exception_info, *Ident___exception_info,

561 *Ident_GetExceptionInfo;

562

563 IdentifierInfo *Ident__abnormal_termination, *Ident___abnormal_termination,

564 *Ident_AbnormalTermination;

565

566

568

569

572

573 std::unique_ptr CommentSemaHandler;

574

575

576

577

578 bool CalledSignatureHelp = false;

579

581

582

583

584

585

586 bool SkipFunctionBodies;

587

588

589

590

591

592

593 bool isTokenParen() const { return Tok.isOneOf(tok::l_paren, tok::r_paren); }

594

595 bool isTokenBracket() const {

596 return Tok.isOneOf(tok::l_square, tok::r_square);

597 }

598

599 bool isTokenBrace() const { return Tok.isOneOf(tok::l_brace, tok::r_brace); }

600

601 bool isTokenStringLiteral() const {

603 }

604

605 bool isTokenSpecial() const {

606 return isTokenStringLiteral() || isTokenParen() || isTokenBracket() ||

607 isTokenBrace() || Tok.is(tok::code_completion) || Tok.isAnnotation();

608 }

609

610

611

612 bool isTokenEqualOrEqualTypo();

613

614

615

616 void UnconsumeToken(Token &Consumed) {

617 Token Next = Tok;

618 PP.EnterToken(Consumed, true);

619 PP.Lex(Tok);

620 PP.EnterToken(Next, true);

621 }

622

623 SourceLocation ConsumeAnnotationToken() {

624 assert(Tok.isAnnotation() && "wrong consume method");

625 SourceLocation Loc = Tok.getLocation();

626 PrevTokLocation = Tok.getAnnotationEndLoc();

627 PP.Lex(Tok);

628 return Loc;

629 }

630

631

632

633 SourceLocation ConsumeParen() {

634 assert(isTokenParen() && "wrong consume method");

635 if (Tok.getKind() == tok::l_paren)

636 ++ParenCount;

637 else if (ParenCount) {

638 AngleBrackets.clear(*this);

639 --ParenCount;

640 }

641 PrevTokLocation = Tok.getLocation();

642 PP.Lex(Tok);

643 return PrevTokLocation;

644 }

645

646

647

648 SourceLocation ConsumeBracket() {

649 assert(isTokenBracket() && "wrong consume method");

650 if (Tok.getKind() == tok::l_square)

651 ++BracketCount;

652 else if (BracketCount) {

653 AngleBrackets.clear(*this);

654 --BracketCount;

655 }

656

657 PrevTokLocation = Tok.getLocation();

658 PP.Lex(Tok);

659 return PrevTokLocation;

660 }

661

662

663

664 SourceLocation ConsumeBrace() {

665 assert(isTokenBrace() && "wrong consume method");

666 if (Tok.getKind() == tok::l_brace)

667 ++BraceCount;

668 else if (BraceCount) {

669 AngleBrackets.clear(*this);

670 --BraceCount;

671 }

672

673 PrevTokLocation = Tok.getLocation();

674 PP.Lex(Tok);

675 return PrevTokLocation;

676 }

677

678

679

680

681

682 SourceLocation ConsumeStringToken() {

683 assert(isTokenStringLiteral() &&

684 "Should only consume string literals with this method");

685 PrevTokLocation = Tok.getLocation();

686 PP.Lex(Tok);

687 return PrevTokLocation;

688 }

689

690

691

692

693

694

695 SourceLocation ConsumeCodeCompletionToken() {

696 assert(Tok.is(tok::code_completion));

697 PrevTokLocation = Tok.getLocation();

698 PP.Lex(Tok);

699 return PrevTokLocation;

700 }

701

702

703

704

705

706

707 SourceLocation handleUnexpectedCodeCompletionToken();

708

709

710

711 void cutOffParsing() {

712 if (PP.isCodeCompletionEnabled())

713 PP.setCodeCompletionReached();

714

715 Tok.setKind(tok::eof);

716 }

717

718

719

720 bool isEofOrEom() {

722 return Kind == tok::eof || Kind == tok::annot_module_begin ||

723 Kind == tok::annot_module_end || Kind == tok::annot_module_include ||

724 Kind == tok::annot_repl_input_end;

725 }

726

727 static void setTypeAnnotation(Token &Tok, TypeResult T) {

728 assert((T.isInvalid() || T.get()) &&

729 "produced a valid-but-null type annotation?");

730 Tok.setAnnotationValue(T.isInvalid() ? nullptr : T.get().getAsOpaquePtr());

731 }

732

733 static NamedDecl *getNonTypeAnnotation(const Token &Tok) {

734 return static_cast<NamedDecl *>(Tok.getAnnotationValue());

735 }

736

737 static void setNonTypeAnnotation(Token &Tok, NamedDecl *ND) {

738 Tok.setAnnotationValue(ND);

739 }

740

741 static IdentifierInfo *getIdentifierAnnotation(const Token &Tok) {

742 return static_cast<IdentifierInfo *>(Tok.getAnnotationValue());

743 }

744

745 static void setIdentifierAnnotation(Token &Tok, IdentifierInfo *ND) {

746 Tok.setAnnotationValue(ND);

747 }

748

749

750

751 static ExprResult getExprAnnotation(const Token &Tok) {

752 return ExprResult::getFromOpaquePointer(Tok.getAnnotationValue());

753 }

754

755

756

757 static void setExprAnnotation(Token &Tok, ExprResult ER) {

758 Tok.setAnnotationValue(ER.getAsOpaquePointer());

759 }

760

761

762

763

764

765

766

767

768

769

770

772 TryAnnotateName(CorrectionCandidateCallback *CCC = nullptr,

775

776

777 void AnnotateScopeToken(CXXScopeSpec &SS, bool IsNewAnnotation);

778

779

780

781

782

783

784 bool TryKeywordIdentFallback(bool DisableKeyword);

785

786

787

788

789 TemplateIdAnnotation *takeTemplateIdAnnotation(const Token &tok);

790

791

792

793

794

795

796

797

798

800 unsigned Diag = diag::err_expected,

801 StringRef DiagMsg = "");

802

803

804

805

806

807

808 bool ExpectAndConsumeSemi(unsigned DiagID, StringRef TokenUsed = "");

809

810

812

813

814

815

816

817

818

819 bool expectIdentifier();

820

821

822 enum class CompoundToken {

823

824 StmtExprBegin,

825

826 StmtExprEnd,

827

828 AttrBegin,

829

830 AttrEnd,

831

832 MemberPtr,

833 };

834

835

836

837 void checkCompoundToken(SourceLocation FirstTokLoc,

839

840 void diagnoseUseOfC11Keyword(const Token &Tok);

841

842

843 class ParseScopeFlags {

844 Scope *CurScope;

845 unsigned OldFlags = 0;

846 ParseScopeFlags(const ParseScopeFlags &) = delete;

847 void operator=(const ParseScopeFlags &) = delete;

848

849 public:

850

851

852 ParseScopeFlags(Parser *Self, unsigned ScopeFlags, bool ManageFlags = true);

853

854

855

856 ~ParseScopeFlags();

857 };

858

859

860

861

862

863

864

865

866 void SuggestParentheses(SourceLocation Loc, unsigned DK,

867 SourceRange ParenRange);

868

869

870

871

872

873

874

875

876

877

878

879

880

881

882

883

884

885

886

887

888

889

890

891

892

893

894

895

896

897

898

899

900

901

902

903 DeclGroupPtrTy ParseExternalDeclaration(ParsedAttributes &DeclAttrs,

904 ParsedAttributes &DeclSpecAttrs,

905 ParsingDeclSpec *DS = nullptr);

906

907

908

909 bool isDeclarationAfterDeclarator();

910

911

912

913 bool isStartOfFunctionDefinition(const ParsingDeclarator &Declarator);

914

916 ParsedAttributes &DeclAttrs, ParsedAttributes &DeclSpecAttrs,

918

919

920

921

922

923

924

925

926

927

928

929

930

931

932

933

934

935

936

937 DeclGroupPtrTy ParseDeclOrFunctionDefInternal(ParsedAttributes &Attrs,

938 ParsedAttributes &DeclSpecAttrs,

939 ParsingDeclSpec &DS,

941

942 void SkipFunctionBody();

943

944 struct ParsedTemplateInfo;

945 class LateParsedAttrList;

946

947

948

949

950

951

952

953

954

955

956

957

958

959

960

961

962

963 Decl *ParseFunctionDefinition(

964 ParsingDeclarator &D,

965 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),

966 LateParsedAttrList *LateParsedAttrs = nullptr);

967

968

969

970 void ParseKNRParamDeclarations(Declarator &D);

971

972

973

974

975

976

977

978

979

980 ExprResult ParseSimpleAsm(bool ForAsmLabel, SourceLocation *EndLoc);

981

982

983

984

985

986

987

988

989

990

991

992

993 ExprResult ParseAsmStringLiteral(bool ForAsmLabel);

994

995

996

997 struct IfExistsCondition {

998

999 SourceLocation KeywordLoc;

1000

1001

1002 bool IsIfExists;

1003

1004

1005 CXXScopeSpec SS;

1006

1007

1009

1010

1011

1013 };

1014

1015 bool ParseMicrosoftIfExistsCondition(IfExistsCondition &Result);

1016 void ParseMicrosoftIfExistsExternalDeclaration();

1017

1018

1019

1020

1021

1022

1023

1024

1025

1026

1027

1028

1029

1030

1031

1032

1033

1034

1035

1037

1038

1039

1040

1041

1042

1043

1044

1045

1046

1047

1048

1049

1050

1051

1052

1053

1054

1055 Decl *ParseModuleImport(SourceLocation AtLoc,

1057

1058

1059

1060

1061

1062 bool parseMisplacedModuleImport();

1063

1064 bool tryParseMisplacedModuleImport() {

1066 if (Kind == tok::annot_module_begin || Kind == tok::annot_module_end ||

1067 Kind == tok::annot_module_include)

1068 return parseMisplacedModuleImport();

1069 return false;

1070 }

1071

1072

1073

1074

1075

1076

1077

1078

1079

1080

1081 bool ParseModuleName(SourceLocation UseLoc,

1082 SmallVectorImpl &Path, bool IsImport);

1083

1084

1085

1086 void CodeCompleteDirective(bool InConditional) override;

1088 void CodeCompleteMacroName(bool IsDefinition) override;

1090 void CodeCompleteMacroArgument(IdentifierInfo *Macro, MacroInfo *MacroInfo,

1091 unsigned ArgumentIndex) override;

1092 void CodeCompleteIncludedFile(llvm::StringRef Dir, bool IsAngled) override;

1094

1095

1096

1097

1098

1099

1100

1101

1102

1103

1104

1105

1106

1107private:

1108 struct ParsingClass;

1109

1110

1111

1112

1113

1114

1115

1116

1117

1118 class LateParsedDeclaration {

1119 public:

1120 virtual ~LateParsedDeclaration();

1121

1122 virtual void ParseLexedMethodDeclarations();

1123 virtual void ParseLexedMemberInitializers();

1124 virtual void ParseLexedMethodDefs();

1125 virtual void ParseLexedAttributes();

1126 virtual void ParseLexedPragmas();

1127 };

1128

1129

1130

1131 class LateParsedClass : public LateParsedDeclaration {

1132 public:

1133 LateParsedClass(Parser *P, ParsingClass *C);

1134 ~LateParsedClass() override;

1135

1136 void ParseLexedMethodDeclarations() override;

1137 void ParseLexedMemberInitializers() override;

1138 void ParseLexedMethodDefs() override;

1139 void ParseLexedAttributes() override;

1140 void ParseLexedPragmas() override;

1141

1142

1143 LateParsedClass(const LateParsedClass &) = delete;

1144 LateParsedClass &operator=(const LateParsedClass &) = delete;

1145

1146 private:

1148 ParsingClass *Class;

1149 };

1150

1151

1152

1153

1154

1155

1156

1157 struct LateParsedAttribute : public LateParsedDeclaration {

1160 IdentifierInfo &AttrName;

1161 IdentifierInfo *MacroII = nullptr;

1162 SourceLocation AttrNameLoc;

1163 SmallVector<Decl *, 2> Decls;

1164

1165 explicit LateParsedAttribute(Parser *P, IdentifierInfo &Name,

1166 SourceLocation Loc)

1167 : Self(P), AttrName(Name), AttrNameLoc(Loc) {}

1168

1169 void ParseLexedAttributes() override;

1170

1171 void addDecl(Decl *D) { Decls.push_back(D); }

1172 };

1173

1174

1175

1176

1177

1178 class LateParsedPragma : public LateParsedDeclaration {

1179 Parser *Self = nullptr;

1182

1183 public:

1185 : Self(P), AS(AS) {}

1186

1187 void takeToks(CachedTokens &Cached) { Toks.swap(Cached); }

1188 const CachedTokens &toks() const { return Toks; }

1189 AccessSpecifier getAccessSpecifier() const { return AS; }

1190

1191 void ParseLexedPragmas() override;

1192 };

1193

1194

1195 class LateParsedAttrList : public SmallVector<LateParsedAttribute *, 2> {

1196 public:

1197 LateParsedAttrList(bool PSoon = false,

1198 bool LateAttrParseExperimentalExtOnly = false)

1199 : ParseSoon(PSoon),

1200 LateAttrParseExperimentalExtOnly(LateAttrParseExperimentalExtOnly) {}

1201

1202 bool parseSoon() { return ParseSoon; }

1203

1204

1205 bool lateAttrParseExperimentalExtOnly() {

1206 return LateAttrParseExperimentalExtOnly;

1207 }

1208

1209 private:

1210 bool ParseSoon;

1211 bool LateAttrParseExperimentalExtOnly;

1212 };

1213

1214

1215

1216

1217 struct LexedMethod : public LateParsedDeclaration {

1221

1222 explicit LexedMethod(Parser *P, Decl *MD) : Self(P), D(MD) {}

1223

1224 void ParseLexedMethodDefs() override;

1225 };

1226

1227

1228

1229

1230

1231 struct LateParsedDefaultArgument {

1232 explicit LateParsedDefaultArgument(

1233 Decl *P, std::unique_ptr Toks = nullptr)

1234 : Param(P), Toks(std::move(Toks)) {}

1235

1236

1237 Decl *Param;

1238

1239

1240

1241

1242

1243 std::unique_ptr Toks;

1244 };

1245

1246

1247

1248

1249

1250 struct LateParsedMethodDeclaration : public LateParsedDeclaration {

1251 explicit LateParsedMethodDeclaration(Parser *P, Decl *M)

1252 : Self(P), Method(M), ExceptionSpecTokens(nullptr) {}

1253

1254 void ParseLexedMethodDeclarations() override;

1255

1257

1258

1259 Decl *Method;

1260

1261

1262

1263

1264

1265

1266 SmallVector<LateParsedDefaultArgument, 8> DefaultArgs;

1267

1268

1269

1271 };

1272

1273

1274

1275

1276 struct LateParsedMemberInitializer : public LateParsedDeclaration {

1277 LateParsedMemberInitializer(Parser *P, Decl *FD) : Self(P), Field(FD) {}

1278

1279 void ParseLexedMemberInitializers() override;

1280

1282

1283

1284 Decl *Field;

1285

1286

1287

1289 };

1290

1291

1292

1293

1294

1295

1296

1297 typedef SmallVector<LateParsedDeclaration *, 2>

1298 LateParsedDeclarationsContainer;

1299

1300

1301

1303

1304

1305

1307

1308

1309

1310

1312 const ParsedAttributesView &AccessAttrs,

1313 ParsingDeclarator &D,

1314 const ParsedTemplateInfo &TemplateInfo,

1315 const VirtSpecifiers &VS,

1316 SourceLocation PureSpecLoc);

1317

1318

1319 StringLiteral *ParseCXXDeletedFunctionMessage();

1320

1321

1322

1323

1324 void SkipDeletedFunctionBody();

1325

1326

1327

1328

1329

1330 void ParseCXXNonStaticMemberInitializer(Decl *VarD);

1331

1332

1333

1334 void ParseLexedAttributes(ParsingClass &Class);

1335

1336

1337 void ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D,

1338 bool EnterScope, bool OnDefinition);

1339

1340

1341

1342

1343

1344

1345 void ParseLexedAttribute(LateParsedAttribute &LA, bool EnterScope,

1346 bool OnDefinition);

1347

1348

1349

1350

1351

1352 void ParseLexedMethodDeclarations(ParsingClass &Class);

1353 void ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM);

1354

1355

1356

1357

1358 void ParseLexedMethodDefs(ParsingClass &Class);

1359 void ParseLexedMethodDef(LexedMethod &LM);

1360

1361

1362

1363

1364

1365 void ParseLexedMemberInitializers(ParsingClass &Class);

1366 void ParseLexedMemberInitializer(LateParsedMemberInitializer &MI);

1367

1368

1369

1370

1371

1372

1373

1374

1375

1376

1377

1378

1379

1380public:

1381

1382

1383

1384

1385

1386

1388

1389

1390

1391

1392

1393

1394

1395

1400 ParsedAttributes *Attrs = nullptr);

1401

1402private:

1403

1404

1405

1406 IdentifierInfo *Ident_vector;

1407 IdentifierInfo *Ident_bool;

1408 IdentifierInfo *Ident_Bool;

1409

1410

1411

1412 IdentifierInfo *Ident_pixel;

1413

1414

1415 IdentifierInfo *Ident_introduced;

1416

1417

1418 IdentifierInfo *Ident_deprecated;

1419

1420

1421 IdentifierInfo *Ident_obsoleted;

1422

1423

1424 IdentifierInfo *Ident_unavailable;

1425

1426

1427 IdentifierInfo *Ident_message;

1428

1429

1430 IdentifierInfo *Ident_strict;

1431

1432

1433 IdentifierInfo *Ident_replacement;

1434

1435

1436 IdentifierInfo *Ident_environment;

1437

1438

1439 IdentifierInfo *Ident_language, *Ident_defined_in,

1440 *Ident_generated_declaration, *Ident_USR;

1441

1442

1443 AttributeFactory AttrFactory;

1444

1445

1446

1447

1448 bool TryAltiVecToken(DeclSpec &DS, SourceLocation Loc, const char *&PrevSpec,

1449 unsigned &DiagID, bool &isInvalid) {

1451 return false;

1452

1453 if (Tok.getIdentifierInfo() != Ident_vector &&

1454 Tok.getIdentifierInfo() != Ident_bool &&

1455 Tok.getIdentifierInfo() != Ident_Bool &&

1456 (getLangOpts().AltiVec || Tok.getIdentifierInfo() != Ident_pixel))

1457 return false;

1458

1459 return TryAltiVecTokenOutOfLine(DS, Loc, PrevSpec, DiagID, isInvalid);

1460 }

1461

1462

1463

1464

1465 bool TryAltiVecVectorToken() {

1467 Tok.getIdentifierInfo() != Ident_vector)

1468 return false;

1469 return TryAltiVecVectorTokenOutOfLine();

1470 }

1471

1472

1473

1474 bool TryAltiVecVectorTokenOutOfLine();

1475 bool TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc,

1476 const char *&PrevSpec, unsigned &DiagID,

1478

1479 void ParseLexedCAttributeList(LateParsedAttrList &LA, bool EnterScope,

1480 ParsedAttributes *OutAttrs = nullptr);

1481

1482

1483

1484

1485

1486

1487 void ParseLexedCAttribute(LateParsedAttribute &LA, bool EnterScope,

1488 ParsedAttributes *OutAttrs = nullptr);

1489

1490 void ParseLexedPragmas(ParsingClass &Class);

1491 void ParseLexedPragma(LateParsedPragma &LP);

1492

1493

1494

1495

1496

1497

1498

1499 bool ConsumeAndStoreFunctionPrologue(CachedTokens &Toks);

1500

1501

1502

1503

1504

1505

1506

1507

1509

1510

1511

1512 bool ConsumeAndStoreConditional(CachedTokens &Toks);

1515 bool ConsumeFinalToken = true) {

1516 return ConsumeAndStoreUntil(T1, T1, Toks, StopAtSemi, ConsumeFinalToken);

1517 }

1518

1519

1520

1521

1522

1523

1524

1527 bool ConsumeFinalToken = true);

1528

1529

1530

1531

1532

1533

1534

1535 enum class DeclSpecContext {

1536 DSC_normal,

1537 DSC_class,

1538 DSC_type_specifier,

1539 DSC_trailing,

1540 DSC_alias_declaration,

1541 DSC_conv_operator,

1542 DSC_top_level,

1543 DSC_template_param,

1544 DSC_template_arg,

1545 DSC_template_type_arg,

1546 DSC_objc_method_result,

1547

1548 DSC_condition,

1549 DSC_association,

1550 DSC_new,

1551 };

1552

1553

1554

1555 static bool isTypeSpecifier(DeclSpecContext DSC) {

1556 switch (DSC) {

1557 case DeclSpecContext::DSC_normal:

1558 case DeclSpecContext::DSC_template_param:

1559 case DeclSpecContext::DSC_template_arg:

1560 case DeclSpecContext::DSC_class:

1561 case DeclSpecContext::DSC_top_level:

1562 case DeclSpecContext::DSC_objc_method_result:

1563 case DeclSpecContext::DSC_condition:

1564 return false;

1565

1566 case DeclSpecContext::DSC_template_type_arg:

1567 case DeclSpecContext::DSC_type_specifier:

1568 case DeclSpecContext::DSC_conv_operator:

1569 case DeclSpecContext::DSC_trailing:

1570 case DeclSpecContext::DSC_alias_declaration:

1571 case DeclSpecContext::DSC_association:

1572 case DeclSpecContext::DSC_new:

1573 return true;

1574 }

1575 llvm_unreachable("Missing DeclSpecContext case");

1576 }

1577

1578

1579 enum class AllowDefiningTypeSpec {

1580

1581

1582 No,

1583

1584

1585 NoButErrorRecovery,

1586

1587

1588 YesButInvalid,

1589

1590 Yes

1591 };

1592

1593

1594

1595

1596 static AllowDefiningTypeSpec

1597 isDefiningTypeSpecifierContext(DeclSpecContext DSC, bool IsCPlusPlus) {

1598 switch (DSC) {

1599 case DeclSpecContext::DSC_normal:

1600 case DeclSpecContext::DSC_class:

1601 case DeclSpecContext::DSC_top_level:

1602 case DeclSpecContext::DSC_alias_declaration:

1603 case DeclSpecContext::DSC_objc_method_result:

1604 return AllowDefiningTypeSpec::Yes;

1605

1606 case DeclSpecContext::DSC_condition:

1607 case DeclSpecContext::DSC_template_param:

1608 return AllowDefiningTypeSpec::YesButInvalid;

1609

1610 case DeclSpecContext::DSC_template_type_arg:

1611 case DeclSpecContext::DSC_type_specifier:

1612 return AllowDefiningTypeSpec::NoButErrorRecovery;

1613

1614 case DeclSpecContext::DSC_association:

1615 return IsCPlusPlus ? AllowDefiningTypeSpec::NoButErrorRecovery

1616 : AllowDefiningTypeSpec::Yes;

1617

1618 case DeclSpecContext::DSC_trailing:

1619 case DeclSpecContext::DSC_conv_operator:

1620 case DeclSpecContext::DSC_template_arg:

1621 case DeclSpecContext::DSC_new:

1622 return AllowDefiningTypeSpec::No;

1623 }

1624 llvm_unreachable("Missing DeclSpecContext case");

1625 }

1626

1627

1628 static bool isOpaqueEnumDeclarationContext(DeclSpecContext DSC) {

1629 switch (DSC) {

1630 case DeclSpecContext::DSC_normal:

1631 case DeclSpecContext::DSC_class:

1632 case DeclSpecContext::DSC_top_level:

1633 return true;

1634

1635 case DeclSpecContext::DSC_alias_declaration:

1636 case DeclSpecContext::DSC_objc_method_result:

1637 case DeclSpecContext::DSC_condition:

1638 case DeclSpecContext::DSC_template_param:

1639 case DeclSpecContext::DSC_template_type_arg:

1640 case DeclSpecContext::DSC_type_specifier:

1641 case DeclSpecContext::DSC_trailing:

1642 case DeclSpecContext::DSC_association:

1643 case DeclSpecContext::DSC_conv_operator:

1644 case DeclSpecContext::DSC_template_arg:

1645 case DeclSpecContext::DSC_new:

1646

1647 return false;

1648 }

1649 llvm_unreachable("Missing DeclSpecContext case");

1650 }

1651

1652

1653

1654 static bool isClassTemplateDeductionContext(DeclSpecContext DSC) {

1655 switch (DSC) {

1656 case DeclSpecContext::DSC_normal:

1657 case DeclSpecContext::DSC_template_param:

1658 case DeclSpecContext::DSC_template_arg:

1659 case DeclSpecContext::DSC_class:

1660 case DeclSpecContext::DSC_top_level:

1661 case DeclSpecContext::DSC_condition:

1662 case DeclSpecContext::DSC_type_specifier:

1663 case DeclSpecContext::DSC_association:

1664 case DeclSpecContext::DSC_conv_operator:

1665 case DeclSpecContext::DSC_new:

1666 return true;

1667

1668 case DeclSpecContext::DSC_objc_method_result:

1669 case DeclSpecContext::DSC_template_type_arg:

1670 case DeclSpecContext::DSC_trailing:

1671 case DeclSpecContext::DSC_alias_declaration:

1672 return false;

1673 }

1674 llvm_unreachable("Missing DeclSpecContext case");

1675 }

1676

1677

1679 getImplicitTypenameContext(DeclSpecContext DSC) {

1680 switch (DSC) {

1681 case DeclSpecContext::DSC_class:

1682 case DeclSpecContext::DSC_top_level:

1683 case DeclSpecContext::DSC_type_specifier:

1684 case DeclSpecContext::DSC_template_type_arg:

1685 case DeclSpecContext::DSC_trailing:

1686 case DeclSpecContext::DSC_alias_declaration:

1687 case DeclSpecContext::DSC_template_param:

1688 case DeclSpecContext::DSC_new:

1690

1691 case DeclSpecContext::DSC_normal:

1692 case DeclSpecContext::DSC_objc_method_result:

1693 case DeclSpecContext::DSC_condition:

1694 case DeclSpecContext::DSC_template_arg:

1695 case DeclSpecContext::DSC_conv_operator:

1696 case DeclSpecContext::DSC_association:

1698 }

1699 llvm_unreachable("Missing DeclSpecContext case");

1700 }

1701

1702

1703

1704 struct ForRangeInit {

1705 SourceLocation ColonLoc;

1707 SmallVector<MaterializeTemporaryExpr *, 8> LifetimeExtendTemps;

1708 bool ParsedForRangeDecl() { return !ColonLoc.isInvalid(); }

1709 };

1710 struct ForRangeInfo : ForRangeInit {

1712 };

1713

1714

1715

1716

1717

1718

1719

1720

1721

1722

1723

1724

1725

1726

1727

1728

1729

1730

1731

1733 SourceLocation &DeclEnd,

1734 ParsedAttributes &DeclAttrs,

1735 ParsedAttributes &DeclSpecAttrs,

1736 SourceLocation *DeclSpecStart = nullptr);

1737

1738

1739

1740

1741

1742

1743

1744

1745

1746

1747

1748

1749

1750

1751

1752

1753

1754

1755

1756

1757

1758

1759

1760

1762 ParseSimpleDeclaration(DeclaratorContext Context, SourceLocation &DeclEnd,

1763 ParsedAttributes &DeclAttrs,

1764 ParsedAttributes &DeclSpecAttrs, bool RequireSemi,

1765 ForRangeInit *FRI = nullptr,

1766 SourceLocation *DeclSpecStart = nullptr);

1767

1768

1769

1770

1771

1772

1773

1776 ParsedAttributes &Attrs,

1777 ParsedTemplateInfo &TemplateInfo,

1778 SourceLocation *DeclEnd = nullptr,

1779 ForRangeInit *FRI = nullptr);

1780

1781

1782

1783

1784

1785

1786

1787

1788

1789

1790

1791

1792

1793

1794

1795

1796

1797

1798

1799

1800

1801

1802

1803

1804

1805 Decl *ParseDeclarationAfterDeclarator(

1806 Declarator &D,

1807 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo());

1808

1809

1810

1811 bool ParseAsmAttributesAfterDeclarator(Declarator &D);

1812 Decl *ParseDeclarationAfterDeclaratorAndAttributes(

1813 Declarator &D,

1814 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),

1815 ForRangeInit *FRI = nullptr);

1816

1817

1818

1819

1820

1821

1822

1823

1824

1825

1826 bool ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS,

1828 DeclSpecContext DSC, ParsedAttributes &Attrs);

1829

1830

1831

1832

1833

1834

1835 DeclSpecContext

1836 getDeclSpecContextFromDeclaratorContext(DeclaratorContext Context);

1837 void

1838 ParseDeclarationSpecifiers(DeclSpec &DS, ParsedTemplateInfo &TemplateInfo,

1840 DeclSpecContext DSC = DeclSpecContext::DSC_normal,

1841 LateParsedAttrList *LateAttrs = nullptr) {

1842 return ParseDeclarationSpecifiers(DS, TemplateInfo, AS, DSC, LateAttrs,

1843 getImplicitTypenameContext(DSC));

1844 }

1845

1846

1847

1848

1849

1850

1851

1852

1853

1854

1855

1856

1857

1858

1859

1860

1861

1862

1863

1864

1865

1866

1867

1868

1869

1870

1871

1872

1873

1874

1875 void

1876 ParseDeclarationSpecifiers(DeclSpec &DS, ParsedTemplateInfo &TemplateInfo,

1878 LateParsedAttrList *LateAttrs,

1880

1881

1882

1883

1884

1885

1886

1887

1888 bool DiagnoseMissingSemiAfterTagDefinition(

1889 DeclSpec &DS, AccessSpecifier AS, DeclSpecContext DSContext,

1890 LateParsedAttrList *LateAttrs = nullptr);

1891

1892 void ParseSpecifierQualifierList(

1894 DeclSpecContext DSC = DeclSpecContext::DSC_normal) {

1895 ParseSpecifierQualifierList(DS, getImplicitTypenameContext(DSC), AS, DSC);

1896 }

1897

1898

1899

1900

1901

1902

1903

1904

1905

1906 void ParseSpecifierQualifierList(

1909 DeclSpecContext DSC = DeclSpecContext::DSC_normal);

1910

1911

1912

1913

1914

1915

1916

1917

1918

1919

1920

1921

1922

1923

1924

1925

1926

1927

1928

1929

1930

1931

1932

1933

1934

1935

1936

1937

1938

1939

1940

1941

1942

1943 void ParseEnumSpecifier(SourceLocation TagLoc, DeclSpec &DS,

1944 const ParsedTemplateInfo &TemplateInfo,

1946

1947

1948

1949

1950

1951

1952

1953

1954

1955

1956

1957

1958

1959 void ParseEnumBody(SourceLocation StartLoc, Decl *TagDecl,

1960 SkipBodyInfo *SkipBody = nullptr);

1961

1962

1963

1964

1965

1966

1967

1968

1969

1970

1971

1972

1973

1974 void ParseStructUnionBody(SourceLocation StartLoc, DeclSpec::TST TagType,

1975 RecordDecl *TagDecl);

1976

1977

1978

1979

1980

1981

1982

1983

1984

1985

1986

1987

1988

1989

1990

1991

1992

1993

1994

1995

1996

1997

1998

1999

2000 void ParseStructDeclaration(

2001 ParsingDeclSpec &DS,

2002 llvm::function_ref<Decl *(ParsingFieldDeclarator &)> FieldsCallback,

2003 LateParsedAttrList *LateFieldAttrs = nullptr);

2004

2006

2007

2008

2009

2010

2011

2012

2013

2015 bool DisambiguatingWithExpression = false);

2016

2017

2018

2019 bool isTypeSpecifierQualifier();

2020

2021

2022

2023

2024 bool isKnownToBeTypeSpecifier(const Token &Tok) const;

2025

2026

2027

2028

2029 bool isConstructorDeclarator(

2030 bool Unqualified, bool DeductionGuide = false,

2032 const ParsedTemplateInfo *TemplateInfo = nullptr);

2033

2034

2035

2036 void DiagnoseBitIntUse(const Token &Tok);

2037

2038

2039

2040 bool CheckProhibitedCXX11Attribute() {

2041 assert(Tok.is(tok::l_square));

2043 return false;

2044 return DiagnoseProhibitedCXX11Attribute();

2045 }

2046

2047

2048

2049

2050

2051

2052

2053

2054

2055 bool DiagnoseProhibitedCXX11Attribute();

2056

2057 void CheckMisplacedCXX11Attribute(ParsedAttributes &Attrs,

2058 SourceLocation CorrectLocation) {

2059 if (!Tok.isRegularKeywordAttribute() &&

2060 (Tok.isNot(tok::l_square) || NextToken().isNot(tok::l_square)) &&

2061 Tok.isNot(tok::kw_alignas))

2062 return;

2063 DiagnoseMisplacedCXX11Attribute(Attrs, CorrectLocation);

2064 }

2065

2066

2067

2068

2069

2070 void DiagnoseMisplacedCXX11Attribute(ParsedAttributes &Attrs,

2071 SourceLocation CorrectLocation);

2072

2073

2074

2075

2076

2077

2078

2079

2080

2081 void stripTypeAttributesOffDeclSpec(ParsedAttributes &Attrs, DeclSpec &DS,

2083

2084

2085 void ProhibitAttributes(ParsedAttributes &Attrs,

2086 SourceLocation FixItLoc = SourceLocation()) {

2087 if (Attrs.Range.isInvalid())

2088 return;

2089 DiagnoseProhibitedAttributes(Attrs, FixItLoc);

2090 Attrs.clear();

2091 }

2092

2093 void ProhibitAttributes(ParsedAttributesView &Attrs,

2094 SourceLocation FixItLoc = SourceLocation()) {

2095 if (Attrs.Range.isInvalid())

2096 return;

2097 DiagnoseProhibitedAttributes(Attrs, FixItLoc);

2098 Attrs.clearListOnly();

2099 }

2100 void DiagnoseProhibitedAttributes(const ParsedAttributesView &Attrs,

2101 SourceLocation FixItLoc);

2102

2103

2104

2105

2106

2107

2108

2109 void ProhibitCXX11Attributes(ParsedAttributes &Attrs, unsigned AttrDiagID,

2110 unsigned KeywordDiagId,

2111 bool DiagnoseEmptyAttrs = false,

2112 bool WarnOnUnknownAttrs = false);

2113

2114

2115

2116 void DiagnoseCXX11AttributeExtension(ParsedAttributes &Attrs);

2117

2118 ExprResult ParseUnevaluatedStringInAttribute(const IdentifierInfo &AttrName);

2119

2120 bool

2121 ParseAttributeArgumentList(const clang::IdentifierInfo &AttrName,

2122 SmallVectorImpl<Expr *> &Exprs,

2123 ParsedAttributeArgumentsProperties ArgsProperties);

2124

2125

2126

2127

2128

2129 unsigned

2130 ParseAttributeArgsCommon(IdentifierInfo *AttrName, SourceLocation AttrNameLoc,

2131 ParsedAttributes &Attrs, SourceLocation *EndLoc,

2132 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,

2133 ParsedAttr::Form Form);

2134

2135 enum ParseAttrKindMask {

2136 PAKM_GNU = 1 << 0,

2137 PAKM_Declspec = 1 << 1,

2138 PAKM_CXX11 = 1 << 2,

2139 };

2140

2141

2142

2143

2144

2145

2146

2147

2148

2149

2150

2151

2152

2153

2154

2155

2156

2157 void ParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs,

2158 LateParsedAttrList *LateAttrs = nullptr);

2159

2160

2161 bool MaybeParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs,

2162 LateParsedAttrList *LateAttrs = nullptr) {

2163 if (Tok.isOneOf(tok::kw___attribute, tok::kw___declspec) ||

2164 isAllowedCXX11AttributeSpecifier()) {

2165 ParseAttributes(WhichAttrKinds, Attrs, LateAttrs);

2166 return true;

2167 }

2168 return false;

2169 }

2170

2171 void MaybeParseGNUAttributes(Declarator &D,

2172 LateParsedAttrList *LateAttrs = nullptr) {

2173 if (Tok.is(tok::kw___attribute)) {

2174 ParsedAttributes Attrs(AttrFactory);

2175 ParseGNUAttributes(Attrs, LateAttrs, &D);

2176 D.takeAttributesAppending(Attrs);

2177 }

2178 }

2179

2180 bool MaybeParseGNUAttributes(ParsedAttributes &Attrs,

2181 LateParsedAttrList *LateAttrs = nullptr) {

2182 if (Tok.is(tok::kw___attribute)) {

2183 ParseGNUAttributes(Attrs, LateAttrs);

2184 return true;

2185 }

2186 return false;

2187 }

2188

2189

2190

2191

2192

2193

2194

2195

2196

2197

2198

2199

2200

2201

2202

2203

2204

2205 bool ParseSingleGNUAttribute(ParsedAttributes &Attrs, SourceLocation &EndLoc,

2206 LateParsedAttrList *LateAttrs = nullptr,

2207 Declarator *D = nullptr);

2208

2209

2210

2211

2212

2213

2214

2215

2216

2217

2218

2219

2220

2221

2222

2223

2224

2225

2226

2227

2228

2229

2230

2231

2232

2233

2234

2235

2236

2237

2238

2239

2240

2241

2242

2243

2244

2245

2246

2247

2248

2249

2250

2251

2252 void ParseGNUAttributes(ParsedAttributes &Attrs,

2253 LateParsedAttrList *LateAttrs = nullptr,

2254 Declarator *D = nullptr);

2255

2256

2257

2258 void ParseGNUAttributeArgs(IdentifierInfo *AttrName,

2259 SourceLocation AttrNameLoc,

2260 ParsedAttributes &Attrs, SourceLocation *EndLoc,

2261 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,

2262 ParsedAttr::Form Form, Declarator *D);

2263 IdentifierLoc *ParseIdentifierLoc();

2264

2265 unsigned

2266 ParseClangAttributeArgs(IdentifierInfo *AttrName, SourceLocation AttrNameLoc,

2267 ParsedAttributes &Attrs, SourceLocation *EndLoc,

2268 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,

2269 ParsedAttr::Form Form);

2270

2271 void MaybeParseCXX11Attributes(Declarator &D) {

2272 if (isAllowedCXX11AttributeSpecifier()) {

2273 ParsedAttributes Attrs(AttrFactory);

2274 ParseCXX11Attributes(Attrs);

2275 D.takeAttributesAppending(Attrs);

2276 }

2277 }

2278

2279 bool MaybeParseCXX11Attributes(ParsedAttributes &Attrs,

2280 bool OuterMightBeMessageSend = false) {

2281 if (isAllowedCXX11AttributeSpecifier(false, OuterMightBeMessageSend)) {

2282 ParseCXX11Attributes(Attrs);

2283 return true;

2284 }

2285 return false;

2286 }

2287

2288 bool MaybeParseMicrosoftAttributes(ParsedAttributes &Attrs) {

2289 bool AttrsParsed = false;

2291 Tok.is(tok::l_square)) {

2292 ParsedAttributes AttrsWithRange(AttrFactory);

2293 ParseMicrosoftAttributes(AttrsWithRange);

2294 AttrsParsed = !AttrsWithRange.empty();

2295 Attrs.takeAllAppendingFrom(AttrsWithRange);

2296 }

2297 return AttrsParsed;

2298 }

2299 bool MaybeParseMicrosoftDeclSpecs(ParsedAttributes &Attrs) {

2300 if (getLangOpts().DeclSpecKeyword && Tok.is(tok::kw___declspec)) {

2301 ParseMicrosoftDeclSpecs(Attrs);

2302 return true;

2303 }

2304 return false;

2305 }

2306

2307

2308

2309

2310

2311

2312

2313

2314

2315 void ParseMicrosoftDeclSpecs(ParsedAttributes &Attrs);

2316 bool ParseMicrosoftDeclSpecArgs(IdentifierInfo *AttrName,

2317 SourceLocation AttrNameLoc,

2318 ParsedAttributes &Attrs);

2319 void ParseMicrosoftTypeAttributes(ParsedAttributes &attrs);

2320 void ParseWebAssemblyFuncrefTypeAttribute(ParsedAttributes &Attrs);

2321 void DiagnoseAndSkipExtendedMicrosoftTypeAttributes();

2322 SourceLocation SkipExtendedMicrosoftTypeAttributes();

2323

2324 void ParseBorlandTypeAttributes(ParsedAttributes &attrs);

2325 void ParseOpenCLKernelAttributes(ParsedAttributes &attrs);

2326 void ParseOpenCLQualifiers(ParsedAttributes &Attrs);

2327 void ParseNullabilityTypeSpecifiers(ParsedAttributes &attrs);

2328 void ParseCUDAFunctionAttributes(ParsedAttributes &attrs);

2329 bool isHLSLQualifier(const Token &Tok) const;

2330 void ParseHLSLQualifiers(ParsedAttributes &Attrs);

2331

2332

2333

2334

2335

2336

2337

2338

2339

2340

2341

2342 VersionTuple ParseVersionTuple(SourceRange &Range);

2343

2344

2345

2346

2347

2348

2349

2350

2351

2352

2353

2354

2355

2356

2357

2358

2359

2360

2361

2362

2363

2364

2365

2366

2367

2368

2369

2370

2371 void ParseAvailabilityAttribute(IdentifierInfo &Availability,

2372 SourceLocation AvailabilityLoc,

2373 ParsedAttributes &attrs,

2374 SourceLocation *endLoc,

2375 IdentifierInfo *ScopeName,

2376 SourceLocation ScopeLoc,

2377 ParsedAttr::Form Form);

2378

2379

2380

2381

2382

2383

2384

2385

2386

2387

2388

2389

2390

2391

2392

2393

2394

2395 void ParseExternalSourceSymbolAttribute(IdentifierInfo &ExternalSourceSymbol,

2396 SourceLocation Loc,

2397 ParsedAttributes &Attrs,

2398 SourceLocation *EndLoc,

2399 IdentifierInfo *ScopeName,

2400 SourceLocation ScopeLoc,

2401 ParsedAttr::Form Form);

2402

2403

2404

2405

2406

2407

2408

2409

2410

2411

2412

2413

2414

2415

2416 void ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated,

2417 SourceLocation ObjCBridgeRelatedLoc,

2418 ParsedAttributes &Attrs,

2419 SourceLocation *EndLoc,

2420 IdentifierInfo *ScopeName,

2421 SourceLocation ScopeLoc,

2422 ParsedAttr::Form Form);

2423

2424 void ParseSwiftNewTypeAttribute(IdentifierInfo &AttrName,

2425 SourceLocation AttrNameLoc,

2426 ParsedAttributes &Attrs,

2427 SourceLocation *EndLoc,

2428 IdentifierInfo *ScopeName,

2429 SourceLocation ScopeLoc,

2430 ParsedAttr::Form Form);

2431

2432 void ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName,

2433 SourceLocation AttrNameLoc,

2434 ParsedAttributes &Attrs,

2435 SourceLocation *EndLoc,

2436 IdentifierInfo *ScopeName,

2437 SourceLocation ScopeLoc,

2438 ParsedAttr::Form Form);

2439

2440 void ParseAttributeWithTypeArg(IdentifierInfo &AttrName,

2441 SourceLocation AttrNameLoc,

2442 ParsedAttributes &Attrs,

2443 IdentifierInfo *ScopeName,

2444 SourceLocation ScopeLoc,

2445 ParsedAttr::Form Form);

2446

2447 void DistributeCLateParsedAttrs(Decl *Dcl, LateParsedAttrList *LateAttrs);

2448

2449

2450

2451

2452

2453 void ParseBoundsAttribute(IdentifierInfo &AttrName,

2454 SourceLocation AttrNameLoc, ParsedAttributes &Attrs,

2455 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,

2456 ParsedAttr::Form Form);

2457

2458

2459

2460

2461

2462

2463

2464

2465

2466

2467

2468

2469

2470

2471

2472 void ParseTypeofSpecifier(DeclSpec &DS);

2473

2474

2475

2476

2477

2478

2479 void ParseAtomicSpecifier(DeclSpec &DS);

2480

2481

2482

2483

2484

2485

2486

2487

2488

2489 ExprResult ParseAlignArgument(StringRef KWName, SourceLocation Start,

2490 SourceLocation &EllipsisLoc, bool &IsType,

2492

2493

2494

2495

2496

2497

2498

2499

2500

2501

2502

2503 void ParseAlignmentSpecifier(ParsedAttributes &Attrs,

2504 SourceLocation *endLoc = nullptr);

2505 ExprResult ParseExtIntegerArgument();

2506

2507

2508

2509

2510

2511

2512

2513 void ParsePtrauthQualifier(ParsedAttributes &Attrs);

2514

2515

2516

2517

2518 class DeclaratorScopeObj {

2520 CXXScopeSpec &SS;

2521 bool EnteredScope;

2522 bool CreatedScope;

2523

2524 public:

2525 DeclaratorScopeObj(Parser &p, CXXScopeSpec &ss)

2526 : P(p), SS(ss), EnteredScope(false), CreatedScope(false) {}

2527

2528 void EnterDeclaratorScope() {

2529 assert(!EnteredScope && "Already entered the scope!");

2530 assert(SS.isSet() && "C++ scope was not set!");

2531

2532 CreatedScope = true;

2533 P.EnterScope(0);

2534

2535 if (!P.Actions.ActOnCXXEnterDeclaratorScope(P.getCurScope(), SS))

2536 EnteredScope = true;

2537 }

2538

2539 ~DeclaratorScopeObj() {

2540 if (EnteredScope) {

2541 assert(SS.isSet() && "C++ scope was cleared ?");

2542 P.Actions.ActOnCXXExitDeclaratorScope(P.getCurScope(), SS);

2543 }

2544 if (CreatedScope)

2545 P.ExitScope();

2546 }

2547 };

2548

2549

2550 void ParseDeclarator(Declarator &D);

2551

2552 typedef void (Parser::*DirectDeclParseFunction)(Declarator &);

2553

2554

2555

2556

2557

2558

2559

2560

2561

2562

2563

2564

2565

2566

2567

2568

2569

2570

2571

2572

2573

2574

2575

2576

2577

2578

2579

2580

2581 void ParseDeclaratorInternal(Declarator &D,

2582 DirectDeclParseFunction DirectDeclParser);

2583

2584 enum AttrRequirements {

2585 AR_NoAttributesParsed = 0,

2586 AR_GNUAttributesParsedAndRejected = 1 << 0,

2587 AR_GNUAttributesParsed = 1 << 1,

2588 AR_CXX11AttributesParsed = 1 << 2,

2589 AR_DeclspecAttributesParsed = 1 << 3,

2590 AR_AllAttributesParsed = AR_GNUAttributesParsed | AR_CXX11AttributesParsed |

2591 AR_DeclspecAttributesParsed,

2592 AR_VendorAttributesParsed =

2593 AR_GNUAttributesParsed | AR_DeclspecAttributesParsed

2594 };

2595

2596

2597

2598

2599

2600

2601

2602

2603

2604

2605

2606

2607

2608

2609

2610 void ParseTypeQualifierListOpt(

2611 DeclSpec &DS, unsigned AttrReqs = AR_AllAttributesParsed,

2612 bool AtomicOrPtrauthAllowed = true, bool IdentifierRequired = false,

2613 llvm::function_ref<void()> CodeCompletionHandler = {});

2614

2615

2616

2617

2618

2619

2620

2621

2622

2623

2624

2625

2626

2627

2628

2629

2630

2631

2632

2633

2634

2635

2636

2637

2638

2639

2640

2641

2642

2643

2644

2645

2646

2647

2648

2649

2650

2651

2652

2653

2654

2655

2656

2657

2658

2659

2660

2661

2662

2663 void ParseDirectDeclarator(Declarator &D);

2664 void ParseDecompositionDeclarator(Declarator &D);

2665

2666

2667

2668

2669

2670

2671

2672

2673

2674

2675

2676

2677

2678

2679

2680

2681

2682 void ParseParenDeclarator(Declarator &D);

2683

2684

2685

2686

2687

2688

2689

2690

2691

2692

2693

2694

2695

2696

2697

2698

2699

2700

2701

2702

2703

2704

2705

2706

2707 void ParseFunctionDeclarator(Declarator &D, ParsedAttributes &FirstArgAttrs,

2709 bool IsAmbiguous, bool RequiresArg = false);

2710 void InitCXXThisScopeForDeclaratorIfRelevant(

2711 const Declarator &D, const DeclSpec &DS,

2712 std::optionalSema::CXXThisScopeRAII &ThisScope);

2713

2714

2715

2716 bool ParseRefQualifier(bool &RefQualifierIsLValueRef,

2717 SourceLocation &RefQualifierLoc);

2718

2719

2720

2721

2722

2723

2724 bool isFunctionDeclaratorIdentifierList();

2725

2726

2727

2728

2729

2730

2731

2732

2733

2734

2735

2736

2737

2738 void ParseFunctionDeclaratorIdentifierList(

2739 Declarator &D, SmallVectorImplDeclaratorChunk::ParamInfo &ParamInfo);

2740 void ParseParameterDeclarationClause(

2741 Declarator &D, ParsedAttributes &attrs,

2742 SmallVectorImplDeclaratorChunk::ParamInfo &ParamInfo,

2743 SourceLocation &EllipsisLoc) {

2744 return ParseParameterDeclarationClause(

2745 D.getContext(), attrs, ParamInfo, EllipsisLoc,

2746 D.getCXXScopeSpec().isSet() &&

2747 D.isFunctionDeclaratorAFunctionDeclaration());

2748 }

2749

2750

2751

2752

2753

2754

2755

2756

2757

2758

2759

2760

2761

2762

2763

2764

2765

2766

2767

2768

2769

2770

2771

2772

2773

2774

2775

2776

2777

2778

2779

2780

2781

2782

2783

2784

2785 void ParseParameterDeclarationClause(

2787 SmallVectorImplDeclaratorChunk::ParamInfo &ParamInfo,

2788 SourceLocation &EllipsisLoc, bool IsACXXFunctionDeclaration = false);

2789

2790

2791

2792

2793

2794

2795

2796

2797

2798

2799 void ParseBracketDeclarator(Declarator &D);

2800

2801

2802 void ParseMisplacedBracketDeclarator(Declarator &D);

2803

2804

2805

2806

2807

2808

2809

2810

2811

2812

2813 TypeResult ParseTypeFromString(StringRef TypeStr, StringRef Context,

2814 SourceLocation IncludeLoc);

2815

2816

2817

2818

2819

2820

2821

2822

2823

2824

2825

2826

2827

2828private:

2829

2830 mutable IdentifierInfo *Ident_sealed;

2831 mutable IdentifierInfo *Ident_abstract;

2832

2833

2834 mutable IdentifierInfo *Ident_final;

2835 mutable IdentifierInfo *Ident_GNU_final;

2836 mutable IdentifierInfo *Ident_override;

2837 mutable IdentifierInfo *Ident_trivially_relocatable_if_eligible;

2838

2839

2840

2841

2842 struct ParsingClass {

2843 ParsingClass(Decl *TagOrTemplate, bool TopLevelClass, bool IsInterface)

2844 : TopLevelClass(TopLevelClass), IsInterface(IsInterface),

2845 TagOrTemplate(TagOrTemplate) {}

2846

2847

2848

2849 bool TopLevelClass : 1;

2850

2851

2852 bool IsInterface : 1;

2853

2854

2855 Decl *TagOrTemplate;

2856

2857

2858

2859

2860 LateParsedDeclarationsContainer LateParsedDeclarations;

2861 };

2862

2863

2864

2865

2866 std::stack<ParsingClass *> ClassStack;

2867

2868 ParsingClass &getCurrentClass() {

2869 assert(!ClassStack.empty() && "No lexed method stacks!");

2870 return *ClassStack.top();

2871 }

2872

2873

2874 class ParsingClassDefinition {

2876 bool Popped;

2878

2879 public:

2880 ParsingClassDefinition(Parser &P, Decl *TagOrTemplate, bool TopLevelClass,

2881 bool IsInterface)

2882 : P(P), Popped(false),

2883 State(P.PushParsingClass(TagOrTemplate, TopLevelClass, IsInterface)) {

2884 }

2885

2886

2887 void Pop() {

2888 assert(!Popped && "Nested class has already been popped");

2889 Popped = true;

2890 P.PopParsingClass(State);

2891 }

2892

2893 ~ParsingClassDefinition() {

2894 if (!Popped)

2895 P.PopParsingClass(State);

2896 }

2897 };

2898

2899

2900

2901

2902

2903

2904

2905

2906

2907

2908

2909

2911 bool Delayed, SourceRange &SpecificationRange,

2912 SmallVectorImpl &DynamicExceptions,

2913 SmallVectorImpl &DynamicExceptionRanges,

2915

2916

2917

2918

2919

2920

2921

2922

2923

2924

2925

2926

2927

2928

2929

2931 ParseDynamicExceptionSpecification(SourceRange &SpecificationRange,

2932 SmallVectorImpl &Exceptions,

2933 SmallVectorImpl &Ranges);

2934

2935

2936

2937

2938

2939

2940 TypeResult ParseTrailingReturnType(SourceRange &Range,

2941 bool MayBeFollowedByDirectInit);

2942

2943

2944 void ParseTrailingRequiresClause(Declarator &D);

2945

2946 void ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType,

2947 ParsedAttributes &AccessAttrs,

2949

2950 SourceLocation ParsePackIndexingType(DeclSpec &DS);

2951 void AnnotateExistingIndexedTypeNamePack(ParsedType T,

2952 SourceLocation StartLoc,

2953 SourceLocation EndLoc);

2954

2955

2956

2957

2958

2959

2960 bool isAllowedCXX11AttributeSpecifier(bool Disambiguate = false,

2961 bool OuterMightBeMessageSend = false) {

2962 return (Tok.isRegularKeywordAttribute() ||

2963 isCXX11AttributeSpecifier(Disambiguate, OuterMightBeMessageSend) !=

2965 }

2966

2967

2968

2969

2970 SourceLocation SkipCXX11Attributes();

2971

2972

2973

2974 void DiagnoseAndSkipCXX11Attributes();

2975

2976 void ParseOpenMPAttributeArgs(const IdentifierInfo *AttrName,

2978

2979

2980

2981

2982

2983

2984

2985

2986

2987

2988

2989

2990

2991

2992

2993

2994

2995

2996

2997

2998

2999

3000

3001

3002

3003

3004

3005 void ParseCXX11AttributeSpecifierInternal(ParsedAttributes &Attrs,

3007 SourceLocation *EndLoc = nullptr);

3008 void ParseCXX11AttributeSpecifier(ParsedAttributes &Attrs,

3009 SourceLocation *EndLoc = nullptr) {

3011 ParseCXX11AttributeSpecifierInternal(Attrs, OpenMPTokens, EndLoc);

3012 ReplayOpenMPAttributeTokens(OpenMPTokens);

3013 }

3014

3015

3016

3017

3018

3019

3020

3021 void ParseCXX11Attributes(ParsedAttributes &attrs);

3022

3023

3024

3025

3026

3027

3028

3029

3030

3031

3032

3033

3034

3035

3036

3037

3038

3039

3040

3041 bool ParseCXX11AttributeArgs(IdentifierInfo *AttrName,

3042 SourceLocation AttrNameLoc,

3043 ParsedAttributes &Attrs, SourceLocation *EndLoc,

3044 IdentifierInfo *ScopeName,

3045 SourceLocation ScopeLoc,

3047

3048

3049

3050 bool

3051 ParseCXXAssumeAttributeArg(ParsedAttributes &Attrs, IdentifierInfo *AttrName,

3052 SourceLocation AttrNameLoc,

3053 IdentifierInfo *ScopeName, SourceLocation ScopeLoc,

3054 SourceLocation *EndLoc, ParsedAttr::Form Form);

3055

3056

3057

3058

3059

3060

3061

3062

3063

3064

3065 IdentifierInfo *TryParseCXX11AttributeIdentifier(

3066 SourceLocation &Loc,

3069 const IdentifierInfo *EnclosingScope = nullptr);

3070

3071

3072 void ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs);

3073

3074

3075

3076

3077

3078

3079

3080

3081

3082

3083

3084 void ParseMicrosoftAttributes(ParsedAttributes &Attrs);

3085

3086 void ParseMicrosoftInheritanceClassAttributes(ParsedAttributes &attrs);

3087 void ParseNullabilityClassAttributes(ParsedAttributes &attrs);

3088

3089

3090

3091

3092

3093

3094

3095

3096 SourceLocation ParseDecltypeSpecifier(DeclSpec &DS);

3097 void AnnotateExistingDecltypeSpecifier(const DeclSpec &DS,

3098 SourceLocation StartLoc,

3099 SourceLocation EndLoc);

3100

3101

3102

3103

3104

3105

3106

3107

3108

3109

3112 return isCXX11VirtSpecifier(Tok);

3113 }

3114

3115

3116

3117

3118

3119

3120

3121

3122 void ParseOptionalCXX11VirtSpecifierSeq(VirtSpecifiers &VS, bool IsInterface,

3123 SourceLocation FriendLoc);

3124

3125

3126

3127 bool isCXX11FinalKeyword() const;

3128

3129

3130

3131

3132

3133 bool isClassCompatibleKeyword() const;

3134

3135 bool MaybeParseTypeTransformTypeSpecifier(DeclSpec &DS);

3137

3138 void DiagnoseUnexpectedNamespace(NamedDecl *Context);

3139

3140

3141

3142

3143

3144

3145

3146

3147

3148

3149

3150

3151

3152

3153

3154

3155

3156

3157

3158

3159

3160

3161

3162

3163

3164

3165

3166

3167

3168

3170 SourceLocation &DeclEnd,

3171 SourceLocation InlineLoc = SourceLocation());

3172

3173 struct InnerNamespaceInfo {

3174 SourceLocation NamespaceLoc;

3175 SourceLocation InlineLoc;

3176 SourceLocation IdentLoc;

3177 IdentifierInfo *Ident;

3178 };

3179 using InnerNamespaceInfoList = llvm::SmallVector<InnerNamespaceInfo, 4>;

3180

3181

3182 void ParseInnerNamespace(const InnerNamespaceInfoList &InnerNSs,

3183 unsigned int index, SourceLocation &InlineLoc,

3184 ParsedAttributes &attrs,

3186

3187

3188

3189

3190

3191

3192

3193

3194

3195

3197

3198

3199

3200

3201

3202

3203

3204

3205

3206

3207

3208

3209

3210

3211

3212

3213

3214

3215

3216 Decl *ParseExportDeclaration();

3217

3218

3219

3221 DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo,

3222 SourceLocation &DeclEnd, ParsedAttributes &Attrs);

3223

3224

3225

3226

3227

3228

3229

3230

3231

3232

3233

3234

3235

3237 SourceLocation &DeclEnd, ParsedAttributes &attrs);

3238

3239 struct UsingDeclarator {

3240 SourceLocation TypenameLoc;

3241 CXXScopeSpec SS;

3243 SourceLocation EllipsisLoc;

3244

3245 void clear() {

3246 TypenameLoc = EllipsisLoc = SourceLocation();

3247 SS.clear();

3248 Name.clear();

3249 }

3250 };

3251

3252

3253

3254

3255

3256

3257

3258

3259 bool ParseUsingDeclarator(DeclaratorContext Context, UsingDeclarator &D);

3260

3261

3262

3263

3264

3265

3266

3267

3268

3269

3270

3271

3272

3273

3274

3275

3276

3277

3278

3279

3280

3281

3282

3283

3284

3285

3287 const ParsedTemplateInfo &TemplateInfo,

3288 SourceLocation UsingLoc,

3289 SourceLocation &DeclEnd,

3290 ParsedAttributes &Attrs,

3292 Decl *ParseAliasDeclarationAfterDeclarator(

3293 const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc,

3294 UsingDeclarator &D, SourceLocation &DeclEnd, AccessSpecifier AS,

3295 ParsedAttributes &Attrs, Decl **OwnedType = nullptr);

3296

3297

3298

3299

3300

3301

3302

3303

3304

3305

3306

3307

3308 Decl *ParseStaticAssertDeclaration(SourceLocation &DeclEnd);

3309

3310

3311

3312

3313 Decl *ParseNamespaceAlias(SourceLocation NamespaceLoc,

3314 SourceLocation AliasLoc, IdentifierInfo *Alias,

3315 SourceLocation &DeclEnd);

3316

3317

3318

3319

3320

3321

3322

3323 bool isValidAfterTypeSpecifier(bool CouldBeBitfield);

3324

3325

3326

3327

3328

3329

3330

3331

3332

3333

3334

3335

3336

3337

3338

3339

3340

3341

3342

3343

3344

3345

3346

3347

3348

3349

3350

3351

3352

3353

3354

3355

3356

3357

3358

3359

3360

3361

3362

3363

3364

3365

3366

3367 void ParseClassSpecifier(tok::TokenKind TagTokKind, SourceLocation TagLoc,

3368 DeclSpec &DS, ParsedTemplateInfo &TemplateInfo,

3370 DeclSpecContext DSC, ParsedAttributes &Attributes);

3371 void SkipCXXMemberSpecification(SourceLocation StartLoc,

3372 SourceLocation AttrFixitLoc, unsigned TagType,

3373 Decl *TagDecl);

3374

3375

3376

3377

3378

3379

3380

3381

3382

3383 void ParseCXXMemberSpecification(SourceLocation StartLoc,

3384 SourceLocation AttrFixitLoc,

3385 ParsedAttributes &Attrs, unsigned TagType,

3386 Decl *TagDecl);

3387

3388

3389

3390

3391

3392

3393

3394

3395

3396

3397

3398

3399

3400

3401

3402

3403

3404

3405

3406

3407

3408

3409

3410 ExprResult ParseCXXMemberInitializer(Decl *D, bool IsFunction,

3411 SourceLocation &EqualLoc);

3412

3413

3414

3415 bool ParseCXXMemberDeclaratorBeforeInitializer(Declarator &DeclaratorInfo,

3416 VirtSpecifiers &VS,

3418 LateParsedAttrList &LateAttrs);

3419

3420

3421

3422 void

3423 MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(Declarator &D,

3424 VirtSpecifiers &VS);

3425

3426

3427

3428

3429

3430

3431

3432

3433

3434

3435

3436

3437

3438

3439

3440

3441

3442

3443

3444

3445

3446

3447

3448

3449

3450

3451

3452

3453

3454

3455

3456

3457

3458

3459

3460

3461

3462

3463

3464

3465

3466

3467

3468

3469

3470

3471

3472

3473

3474

3475

3476

3477

3480 ParsedTemplateInfo &TemplateInfo,

3481 ParsingDeclRAIIObject *DiagsFromTParams = nullptr);

3483 ParseCXXClassMemberDeclarationWithPragmas(AccessSpecifier &AS,

3484 ParsedAttributes &AccessAttrs,

3486

3487

3488

3489

3490

3491

3492

3493

3494

3495

3496

3497

3498

3499

3500

3501

3502

3503

3504

3505

3506

3507

3508

3509

3510 void ParseConstructorInitializer(Decl *ConstructorDecl);

3511

3512

3513

3514

3515

3516

3517

3518

3519

3520

3521

3522

3523

3524

3525

3526 MemInitResult ParseMemInitializer(Decl *ConstructorDecl);

3527

3528

3529

3530

3531

3532 void HandleMemberFunctionDeclDelays(Declarator &DeclaratorInfo,

3533 Decl *ThisDecl);

3534

3535

3536

3537

3538

3539

3540

3541

3542

3543

3544

3545

3546

3547

3548

3549

3550

3551

3552

3553

3554

3555

3556

3557

3558

3559

3560 TypeResult ParseBaseTypeSpecifier(SourceLocation &BaseLoc,

3561 SourceLocation &EndLocation);

3562

3563

3564

3565

3566

3567

3568

3569

3570

3571

3572

3573 void ParseBaseClause(Decl *ClassDecl);

3574

3575

3576

3577

3578

3579

3580

3581

3582

3583

3584

3585

3586

3587

3588 BaseResult ParseBaseSpecifier(Decl *ClassDecl);

3589

3590

3591

3592

3593

3594

3595

3596

3597

3598

3600

3601 bool isCXX2CTriviallyRelocatableKeyword(Token Tok) const;

3602 bool isCXX2CTriviallyRelocatableKeyword() const;

3603 void ParseCXX2CTriviallyRelocatableSpecifier(SourceLocation &TRS);

3604

3605

3606

3607

3608 bool isClassCompatibleKeyword(Token Tok) const;

3609

3610 void ParseHLSLRootSignatureAttributeArgs(ParsedAttributes &Attrs);

3611

3612

3613

3614

3615

3616

3617

3618

3619

3620

3621

3622

3623

3624public:

3626

3628

3629

3630

3631

3632

3633

3634

3635

3636

3637

3638

3639

3640

3641

3642

3643

3644

3645

3646

3647

3648

3649

3650

3651

3652

3653

3654

3655

3656

3657

3658

3659

3660

3661

3662

3663

3664

3665

3666

3667

3668

3669

3670

3671

3672

3673

3674

3675

3676

3677

3678

3679

3680

3681

3682

3683

3684

3685

3686

3687

3688

3689

3690

3691

3692

3693

3694

3695

3696

3697

3698

3699

3700

3701

3702

3703

3704

3705

3706

3707

3708

3709

3710

3711

3712

3713

3714

3715

3716

3717

3718

3719

3720

3723

3730

3731

3732

3733

3734

3735

3736

3738

3739

3740

3741

3742

3743

3744

3745

3746

3747

3749

3750

3751

3752

3753

3754

3755

3756

3757

3758

3759

3761

3762

3766

3768

3769

3770

3771

3772

3773

3774

3775

3776

3779

3780private:

3781

3782

3783

3784

3785 bool GreaterThanIsOperator;

3786

3787

3788

3789 llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind> RevertibleTypeTraits;

3790

3792

3793

3794

3795

3797

3798

3799 bool isFoldOperator(prec::Level Level) const;

3800

3801

3803

3804

3805

3806

3808 PushParsingClass(Decl *TagOrTemplate, bool TopLevelClass, bool IsInterface);

3809

3810

3811

3812 void DeallocateParsedClasses(ParsingClass *Class);

3813

3814

3815

3816

3817

3818

3819

3821

3824

3825

3826

3827

3828

3829

3831

3832

3833

3834

3836

3837

3838

3840

3841 bool isRevertibleTypeTrait(const IdentifierInfo *Id,

3843

3844

3845

3846

3847

3848

3849

3850

3851

3852

3853

3854

3855

3856

3857

3858

3859

3860

3861

3862

3863

3864

3865

3866

3867

3868

3869

3870

3871

3872

3873

3874

3875

3876

3877

3878

3879

3880

3881

3882

3883

3884

3885

3886

3887

3888

3889

3890

3891

3892

3893

3894

3895

3896

3897

3898

3899

3900

3901

3902

3903

3904

3905

3906

3907

3908

3909

3910

3911

3912

3913

3914

3915

3916

3917

3918

3919

3920

3921

3922

3923

3924

3925

3926

3927

3928

3929

3930

3931

3932

3933

3934

3935

3936

3937

3938

3939

3940

3941

3942

3943

3944

3945

3946

3947

3948

3949

3950

3951

3952

3953

3954

3955

3956

3957

3958

3959

3960

3961

3962

3963

3964

3965

3966

3967

3968

3969

3970

3971

3972

3973

3974

3975

3976

3977

3978

3979

3980

3981

3982

3983

3984

3985

3986

3987

3988

3989

3990

3991

3992

3993

3994

3995

3996

3997

3998

3999

4000

4001

4002

4003

4004

4005

4006

4007

4008

4009

4010

4011

4012

4013

4014

4015

4016

4017

4018

4019

4020

4021

4022

4023

4024

4025

4026

4027

4028

4030 bool isAddressOfOperand, bool &NotCastExpr,

4032 bool isVectorLiteral = false,

4033 bool *NotPrimaryExpression = nullptr);

4035 bool isAddressOfOperand = false,

4038 bool isVectorLiteral = false,

4039 bool *NotPrimaryExpression = nullptr);

4040

4041

4042 bool isNotExpressionStart();

4043

4044

4045

4046 bool isPostfixExpressionSuffixStart() {

4048 return (K == tok::l_square || K == tok::l_paren || K == tok::period ||

4049 K == tok::arrow || K == tok::plusplus || K == tok::minusminus);

4050 }

4051

4052

4053

4054

4055

4056

4057

4058

4059

4060

4061

4062

4063

4064

4065

4066

4067

4068

4069

4070

4071

4072

4074

4075

4076

4077

4078

4079

4080

4081

4082

4083

4084

4085

4086

4087

4088

4089

4090

4091 ExprResult ParseUnaryExprOrTypeTraitExpression();

4092

4093

4094

4095

4096

4097

4098

4099

4100

4101

4102

4103

4104

4105

4106

4107

4108

4109

4110

4111

4112

4113

4114

4115

4116 ExprResult ParseBuiltinPrimaryExpression();

4117

4118

4119

4120 ExprResult ParseSYCLUniqueStableNameExpression();

4121

4122

4123

4124

4125

4126

4127

4128

4129

4130

4131

4132

4133

4134

4135

4136

4137

4138

4139

4140

4141

4142

4143

4144

4145

4146

4147

4148

4149

4150

4151

4152

4153

4154 ExprResult ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,

4155 bool &isCastExpr,

4158

4159

4160

4161

4162

4163

4164

4165

4166

4167

4168

4169

4170

4171

4172

4173

4174

4175

4176

4177

4178

4179

4180

4182 llvm::function_ref<void()> ExpressionStarts =

4183 llvm::function_ref<void()>(),

4184 bool FailImmediatelyOnInvalidExpr = false);

4185

4186

4187

4188

4189

4190

4191

4192

4193

4195

4196

4197

4198

4199

4200

4201

4202

4203

4204

4205

4206

4207

4208

4209

4210

4211

4212

4213

4214

4215

4216

4217

4218

4219

4220

4221

4222

4223

4224

4225

4226

4227

4229 bool StopIfCastExpr,

4234

4235

4236

4237

4238

4239

4240

4241

4242

4246

4247

4248

4249

4250

4251

4252

4253

4254

4255

4256

4257

4258

4259

4260

4261

4262

4263

4264

4265

4266 ExprResult ParseGenericSelectionExpression();

4267

4268

4269

4270

4271

4273

4274

4275

4276

4277

4278

4279

4280

4281

4282

4284

4285 void injectEmbedTokens();

4286

4287

4288

4289

4290

4291

4292

4293

4294

4295

4296

4297

4298

4299

4300 ExprResult ParseBlockLiteralExpression();

4301

4302

4303

4304

4305

4306

4307

4308

4309

4310

4311 ExprResult ParseAssignmentExprWithObjCMessageExprStart(

4313 Expr *ReceiverExpr);

4314

4315

4316

4317

4318 bool isKnownToBeDeclarationSpecifier() {

4321 TPResult::True;

4323 }

4324

4325

4326

4327

4328

4329

4330

4331

4332 bool isTypeIdForGenericSelection() {

4334 bool isAmbiguous;

4336 isAmbiguous);

4337 }

4338 return isTypeSpecifierQualifier();

4339 }

4340

4341

4342

4343

4344 bool isTypeIdUnambiguously() {

4346 bool isAmbiguous;

4348 }

4349 return isTypeSpecifierQualifier();

4350 }

4351

4352

4353

4354

4355

4356

4357

4358 void ParseBlockId(SourceLocation CaretLoc);

4359

4360

4361

4362

4363

4364

4365

4366

4367 std::optional ParseAvailabilitySpec();

4368 ExprResult ParseAvailabilityCheckExpr(SourceLocation StartLoc);

4369

4370

4371

4372

4373

4374 bool tryParseOpenMPArrayShapingCastPart();

4375

4376 ExprResult ParseBuiltinPtrauthTypeDiscriminator();

4377

4378

4379

4380

4381

4382

4383

4384

4385

4386

4387

4388

4389

4390public:

4391

4392

4393

4394

4395

4396

4397

4398

4399

4400

4401

4402

4403

4404

4405

4406

4407

4408

4409

4410

4411

4412

4413

4414

4415

4416

4417

4418

4419

4420

4421

4422

4423

4424

4425

4426

4427

4429 bool ObjectHadErrors, bool EnteringContext,

4430 bool AllowDestructorName, bool AllowConstructorName,

4431 bool AllowDeductionGuide,

4432 SourceLocation *TemplateKWLoc, UnqualifiedId &Result);

4433

4434private:

4435

4436

4437

4438

4439 bool ColonIsSacred;

4440

4441

4442

4443

4444 ExprResult ParseCXXAmbiguousParenExpression(

4447

4448

4449

4450 ExprResult tryParseCXXIdExpression(CXXScopeSpec &SS, bool isAddressOfOperand,

4451 Token &Replacement);

4452

4455

4456

4457

4458

4459

4460

4461

4462

4463

4464

4465

4466

4467

4468

4469

4470

4471

4472

4473

4474

4475

4476

4477

4478

4479

4480

4481

4482

4483

4484

4485

4486

4487

4488

4489

4490

4491

4492

4493

4494

4495

4496

4497

4498

4499

4500

4501

4502 ExprResult ParseCXXIdExpression(bool isAddressOfOperand = false);

4503

4504

4505 bool areTokensAdjacent(const Token &A, const Token &B);

4506

4507

4508

4509 void CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectTypePtr,

4510 bool EnteringContext, IdentifierInfo &II,

4511 CXXScopeSpec &SS);

4512

4513

4514

4515

4516

4517

4518

4519

4520

4521

4522

4523

4524

4525

4526

4527

4528

4529

4530

4531

4532

4533

4534

4535

4536

4537

4538

4539

4540

4541

4542

4543

4544

4545

4546

4547

4548

4549

4550

4551

4552

4553

4554

4555

4556

4557

4558

4559

4560

4561

4562

4563

4564

4565 bool ParseOptionalCXXScopeSpecifier(

4566 CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHasErrors,

4567 bool EnteringContext, bool *MayBePseudoDestructor = nullptr,

4568 bool IsTypename = false, const IdentifierInfo **LastII = nullptr,

4569 bool OnlyNamespace = false, bool InUsingDeclaration = false,

4570 bool Disambiguation = false);

4571

4572

4573

4574

4575

4576 enum class LambdaIntroducerTentativeParse {

4577

4578 Success,

4579

4580

4581 Incomplete,

4582

4583

4584 MessageSend,

4585

4586 Invalid,

4587 };

4588

4589

4590

4591

4592

4593

4594

4595

4596

4597

4598

4599

4600

4601

4602

4603

4604

4605

4606

4607

4608

4609

4610

4611

4612

4613

4614

4615

4616

4617

4618

4619

4620

4621

4622

4623

4624

4625

4626

4627

4628

4629

4630

4631

4632

4633

4634

4635

4637

4638

4639

4640

4641

4642 ExprResult TryParseLambdaExpression();

4643

4644

4645

4646

4647

4648

4649

4650

4651

4652

4653 bool

4654 ParseLambdaIntroducer(LambdaIntroducer &Intro,

4655 LambdaIntroducerTentativeParse *Tentative = nullptr);

4656

4657

4658

4659 ExprResult ParseLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro);

4660

4661

4662

4663

4664

4665

4666

4667

4668

4669

4670

4671

4672

4673

4674

4675

4676

4678

4679

4681

4682

4683

4684

4685

4686

4687

4688

4689

4690

4691

4692

4694

4695

4696

4697

4698

4699

4700

4701

4702

4703

4704

4706

4707

4708

4709

4710

4711

4712

4713

4714

4715

4716

4717

4718

4719

4720

4721

4722

4723

4724

4725

4726

4727

4728

4729

4730

4731

4732

4733

4734

4735

4736

4737

4738

4739

4740

4741

4742

4743 ExprResult ParseCXXPseudoDestructor(Expr *Base, SourceLocation OpLoc,

4746

4747

4748

4749

4750

4751

4752

4753

4754

4756

4757

4758

4759

4760

4761

4762

4763

4764

4765

4767

4768

4769

4770

4771

4772

4773

4774

4775

4776

4777

4779

4780

4781

4782

4783

4784

4785

4786

4787

4788

4789

4790

4791

4792

4793

4794

4795

4796

4797

4798 ExprResult ParseCXXTypeConstructExpression(const DeclSpec &DS);

4799

4800

4801

4802

4803

4804

4805

4806

4807

4808

4809

4810

4811

4812

4813

4814

4815

4816

4817

4818

4819

4820

4821

4822

4823

4824

4825

4826

4827

4828 void ParseCXXSimpleTypeSpecifier(DeclSpec &DS);

4829

4830

4831

4832

4833

4834

4835

4836

4837

4838

4839

4840

4841

4842

4843 bool ParseCXXTypeSpecifierSeq(

4845

4846

4847

4848

4849

4850

4851

4852

4853

4854

4855

4856

4857

4858

4859

4860

4861 bool ParseExpressionListOrTypeId(SmallVectorImpl<Expr *> &Exprs,

4862 Declarator &D);

4863

4864

4865

4866

4867

4868

4869

4870

4871

4872

4873 void ParseDirectNewDeclarator(Declarator &D);

4874

4875

4876

4877

4878

4879

4880

4881

4882

4883

4884

4885

4886

4887

4888

4889

4890

4891

4892

4893

4894

4895

4896

4897

4898

4899

4900

4901

4902

4903

4904

4905

4906 ExprResult ParseCXXNewExpression(bool UseGlobal, SourceLocation Start);

4907

4908

4909

4910

4911

4912

4913

4914

4915

4916

4917

4918

4919

4920

4921 ExprResult ParseCXXDeleteExpression(bool UseGlobal, SourceLocation Start);

4922

4923

4924

4925

4926

4927

4928

4929

4930

4931

4932

4933

4934

4935

4936

4937

4938

4939

4940

4941

4942

4943

4944

4945

4946

4947

4948

4949

4950

4951

4952

4953

4954

4955

4956

4957

4958

4959

4960 Sema::ConditionResult ParseCXXCondition(StmtResult *InitStmt,

4961 SourceLocation Loc,

4963 bool MissingOK,

4964 ForRangeInfo *FRI = nullptr,

4965 bool EnterForConditionScope = false);

4967 ParsedAttributes &Attrs);

4968

4969

4970

4971

4972

4973

4974

4975

4976

4977

4978 ExprResult ParseCoyieldExpression();

4979

4980

4981

4982

4983

4984

4985

4986

4987

4988

4989

4990

4991

4992

4993

4994

4995

4996

4997

4998

4999

5000

5001

5002

5003

5004

5005

5006

5007

5008

5009 ExprResult ParseRequiresExpression();

5010

5011

5012

5013

5014 bool isTypeIdInParens(bool &isAmbiguous) {

5017 isAmbiguous = false;

5018 return isTypeSpecifierQualifier();

5019 }

5020 bool isTypeIdInParens() {

5021 bool isAmbiguous;

5022 return isTypeIdInParens(isAmbiguous);

5023 }

5024

5025

5026

5027

5028

5029

5030

5031

5032

5033

5034

5035

5036

5037

5038

5039

5040

5041

5042

5043

5044

5045

5046

5047

5048

5049

5050

5051

5052

5053

5054

5055

5056

5057

5058

5059

5060 bool ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS, ParsedType ObjectType,

5061 bool ObjectHadErrors,

5062 SourceLocation TemplateKWLoc,

5063 IdentifierInfo *Name,

5064 SourceLocation NameLoc,

5065 bool EnteringContext, UnqualifiedId &Id,

5066 bool AssumeTemplateId);

5067

5068

5069

5070

5071

5072

5073

5074

5075

5076

5077

5078

5079

5080

5081

5082

5083

5084

5085

5086

5087

5088

5089

5090

5091

5092

5093

5094

5095

5096

5097

5098

5099

5100

5101

5102

5103

5104

5105

5106

5107

5108 bool ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext,

5110

5111

5112

5113

5114

5115

5116

5117

5118

5119

5120

5121

5122

5123

5124

5125

5126

5128

5129

5130

5131

5132

5133

5134

5135

5136

5137

5138

5139

5140

5142

5143

5144

5145

5146

5147

5148

5149

5150

5152

5153

5154

5155

5156

5157

5158

5159

5160

5161

5162

5163

5164

5165private:

5166 bool MaybeParseHLSLAnnotations(Declarator &D,

5167 SourceLocation *EndLoc = nullptr,

5168 bool CouldBeBitField = false) {

5169 assert(getLangOpts().HLSL && "MaybeParseHLSLAnnotations is for HLSL only");

5170 if (Tok.is(tok::colon)) {

5171 ParsedAttributes Attrs(AttrFactory);

5172 ParseHLSLAnnotations(Attrs, EndLoc, CouldBeBitField);

5173 D.takeAttributesAppending(Attrs);

5174 return true;

5175 }

5176 return false;

5177 }

5178

5179 void MaybeParseHLSLAnnotations(ParsedAttributes &Attrs,

5180 SourceLocation *EndLoc = nullptr) {

5181 assert(getLangOpts().HLSL && "MaybeParseHLSLAnnotations is for HLSL only");

5182 if (Tok.is(tok::colon))

5183 ParseHLSLAnnotations(Attrs, EndLoc);

5184 }

5185

5186 struct ParsedSemantic {

5187 StringRef Name = "";

5188 unsigned Index = 0;

5189 bool Explicit = false;

5190 };

5191

5192 ParsedSemantic ParseHLSLSemantic();

5193

5194 void ParseHLSLAnnotations(ParsedAttributes &Attrs,

5195 SourceLocation *EndLoc = nullptr,

5196 bool CouldBeBitField = false);

5197 Decl *ParseHLSLBuffer(SourceLocation &DeclEnd, ParsedAttributes &Attrs);

5198

5199

5200

5201

5202

5203

5204

5205

5206

5207

5208

5209

5210

5211private:

5212

5213

5214

5215

5216

5217

5218

5219

5220

5221 ExprResult ParseInitializer(Decl *DeclForInitializer = nullptr);

5222

5223

5224

5225

5226 bool MayBeDesignationStart();

5227

5228

5229

5230

5231

5232

5233

5234

5235

5236

5237

5238

5239

5240

5241

5243

5244 struct DesignatorCompletionInfo {

5245 SmallVectorImpl<Expr *> &InitExprs;

5246 QualType PreferredBaseType;

5247 };

5248

5249

5250

5251

5252

5253

5254

5255

5256

5257

5258

5259

5260

5261

5262

5263

5264

5265

5266

5267

5268

5269

5270

5271

5272

5273

5274

5275

5276

5277

5278

5279

5280

5281

5282

5283

5284

5285

5286

5287

5288

5289

5290

5291

5292

5293

5294

5295 ExprResult ParseInitializerWithPotentialDesignator(DesignatorCompletionInfo);

5296

5298

5299

5300 typedef SmallVector<Expr *, 12> ExprVector;

5301

5302

5303

5304 bool ParseMicrosoftIfExistsBraceInitializer(ExprVector &InitExprs,

5305 bool &InitExprsOk);

5306

5307

5308

5309

5310

5311

5312

5313

5314

5315

5316

5317

5318

5319public:

5321 friend class ObjCDeclContextSwitch;

5322

5324 return Actions.ObjC().getObjCDeclContext();

5325 }

5326

5327

5328

5330 return Actions.getNullabilityKeyword(nullability);

5331 }

5332

5333private:

5334

5336

5337

5338

5340

5341

5342

5343

5344

5345

5346 bool InMessageExpression;

5347

5348

5349

5350

5351

5352

5353 bool ParsingInObjCContainer;

5354

5355

5356

5357

5358 bool isObjCInstancetype() {

5360 if (Tok.isAnnotation())

5361 return false;

5362 if (!Ident_instancetype)

5364 return Tok.getIdentifierInfo() == Ident_instancetype;

5365 }

5366

5367

5368

5369

5372 ObjCContainerDecl *DC;

5373 SaveAndRestore WithinObjCContainer;

5374

5375 public:

5378 WithinObjCContainer(P.ParsingInObjCContainer, DC != nullptr) {

5379 if (DC)

5380 P.Actions.ObjC().ActOnObjCTemporaryExitContainerContext(DC);

5381 }

5382 ~ObjCDeclContextSwitch() {

5383 if (DC)

5384 P.Actions.ObjC().ActOnObjCReenterContainerContext(DC);

5385 }

5386 };

5387

5388 void CheckNestedObjCContexts(SourceLocation AtLoc);

5389

5390 void ParseLexedObjCMethodDefs(LexedMethod &LM, bool parseMethod);

5391

5392

5393

5394

5396

5397

5398

5399

5400

5401

5402

5403

5404

5405

5406

5407

5408 DeclGroupPtrTy ParseObjCAtDirectives(ParsedAttributes &DeclAttrs,

5409 ParsedAttributes &DeclSpecAttrs);

5410

5411

5412

5413

5414

5415

5416

5417

5418

5419

5420 DeclGroupPtrTy ParseObjCAtClassDeclaration(SourceLocation atLoc);

5421

5422

5423

5424

5425

5426

5427

5428

5429

5430

5431

5432

5433

5434

5435

5436

5437

5438

5439

5440

5441

5442

5443

5444

5445

5446

5447

5448

5449

5450

5451

5452

5453 Decl *ParseObjCAtInterfaceDeclaration(SourceLocation AtLoc,

5454 ParsedAttributes &prefixAttrs);

5455

5456

5458

5459

5460 ObjCTypeParamList *parseObjCTypeParamList();

5461

5462

5463

5464

5465

5466

5467

5468

5469

5470

5471

5472

5473

5474

5475

5476

5477

5478

5479

5480

5481

5482

5483

5484

5485

5486

5487

5488 ObjCTypeParamList *parseObjCTypeParamListOrProtocolRefs(

5490 SmallVectorImpl &protocolIdents, SourceLocation &rAngleLoc,

5491 bool mayBeProtocolList = true);

5492

5493 void HelperActionsForIvarDeclarations(ObjCContainerDecl *interfaceDecl,

5494 SourceLocation atLoc,

5496 SmallVectorImpl<Decl *> &AllIvarDecls,

5497 bool RBraceMissing);

5498

5499

5500

5501

5502

5503

5504

5505

5506

5507

5508

5509

5510

5511

5512

5513

5514

5515

5516

5517

5518

5519

5520

5521

5522 void ParseObjCClassInstanceVariables(ObjCContainerDecl *interfaceDecl,

5524 SourceLocation atLoc);

5525

5526

5527

5528

5529

5530

5531 bool ParseObjCProtocolReferences(

5532 SmallVectorImpl<Decl *> &P, SmallVectorImpl &PLocs,

5533 bool WarnOnDeclarations, bool ForObjCContainer, SourceLocation &LAngleLoc,

5534 SourceLocation &EndProtoLoc, bool consumeLastToken);

5535

5536

5537

5538

5539

5540

5541

5542

5543

5544

5545 void parseObjCTypeArgsOrProtocolQualifiers(

5546 ParsedType baseType, SourceLocation &typeArgsLAngleLoc,

5547 SmallVectorImpl &typeArgs, SourceLocation &typeArgsRAngleLoc,

5548 SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols,

5549 SmallVectorImpl &protocolLocs,

5550 SourceLocation &protocolRAngleLoc, bool consumeLastToken,

5551 bool warnOnIncompleteProtocols);

5552

5553

5554

5555 void parseObjCTypeArgsAndProtocolQualifiers(

5556 ParsedType baseType, SourceLocation &typeArgsLAngleLoc,

5557 SmallVectorImpl &typeArgs, SourceLocation &typeArgsRAngleLoc,

5558 SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols,

5559 SmallVectorImpl &protocolLocs,

5560 SourceLocation &protocolRAngleLoc, bool consumeLastToken);

5561

5562

5563

5564 TypeResult parseObjCProtocolQualifierType(SourceLocation &rAngleLoc);

5565

5566

5567

5568 TypeResult parseObjCTypeArgsAndProtocolQualifiers(SourceLocation loc,

5570 bool consumeLastToken,

5571 SourceLocation &endLoc);

5572

5573

5574

5575

5576

5577

5578

5579

5580

5581

5582

5583

5584

5585

5586

5587 void ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl);

5588

5589

5590

5591

5592

5593

5594

5595

5596

5597

5598

5599

5600

5601

5602

5603

5604

5605

5606

5607 DeclGroupPtrTy ParseObjCAtProtocolDeclaration(SourceLocation atLoc,

5608 ParsedAttributes &prefixAttrs);

5609

5610 struct ObjCImplParsingDataRAII {

5613 bool HasCFunction;

5614 typedef SmallVector<LexedMethod *, 8> LateParsedObjCMethodContainer;

5615 LateParsedObjCMethodContainer LateParsedObjCMethods;

5616

5617 ObjCImplParsingDataRAII(Parser &parser, Decl *D)

5618 : P(parser), Dcl(D), HasCFunction(false) {

5619 P.CurParsedObjCImpl = this;

5620 Finished = false;

5621 }

5622 ~ObjCImplParsingDataRAII();

5623

5624 void finish(SourceRange AtEnd);

5625 bool isFinished() const { return Finished; }

5626

5627 private:

5628 bool Finished;

5629 };

5630 ObjCImplParsingDataRAII *CurParsedObjCImpl;

5631

5632

5633

5634 void StashAwayMethodOrFunctionBodyTokens(Decl *MDecl);

5635

5636

5637

5638

5639

5640

5641

5642

5643

5644

5645

5646

5647

5648 DeclGroupPtrTy ParseObjCAtImplementationDeclaration(SourceLocation AtLoc,

5649 ParsedAttributes &Attrs);

5650 DeclGroupPtrTy ParseObjCAtEndDeclaration(SourceRange atEnd);

5651

5652

5653

5654

5655

5656

5657 Decl *ParseObjCAtAliasDeclaration(SourceLocation atLoc);

5658

5659

5660

5661

5662

5663

5664

5665

5666

5667

5668

5669

5670

5671

5672 Decl *ParseObjCPropertySynthesize(SourceLocation atLoc);

5673

5674

5675

5676

5677

5678

5679

5680

5681

5682

5683 Decl *ParseObjCPropertyDynamic(SourceLocation atLoc);

5684

5685

5686

5687

5688

5689

5690

5691

5692

5693

5694

5695 IdentifierInfo *ParseObjCSelectorPiece(SourceLocation &MethodLocation);

5696

5698

5699

5700

5701

5702

5703 bool isTokIdentifier_in() const;

5704

5705

5706

5707

5708

5709

5710

5712 ParsedAttributes *ParamAttrs);

5713

5714

5715

5716

5717

5718

5719

5720

5721

5722

5723

5724

5725

5726 Decl *ParseObjCMethodPrototype(

5728 bool MethodDefinition = true);

5729

5730

5731

5732

5733

5734

5735

5736

5737

5738

5739

5740

5741

5742

5743

5744

5745

5746

5747

5748

5749

5750

5751

5752

5753

5754

5755

5756

5757

5758

5759

5760 Decl *ParseObjCMethodDecl(

5763 bool MethodDefinition = true);

5764

5765

5766

5767

5768

5769

5770

5771

5772

5773

5774

5775

5776

5777

5778

5779

5780

5781

5782

5783

5784

5785

5786

5787

5788

5789

5790

5791

5792

5793 void ParseObjCPropertyAttribute(ObjCDeclSpec &DS);

5794

5795

5796

5797

5798

5799 Decl *ParseObjCMethodDefinition();

5800

5801

5802

5803 ExprResult ParseObjCAtExpression(SourceLocation AtLocation);

5804 ExprResult ParseObjCStringLiteral(SourceLocation AtLoc);

5805

5806

5807

5808

5809

5810

5811 ExprResult ParseObjCCharacterLiteral(SourceLocation AtLoc);

5812

5813

5814

5815

5816

5817

5818

5819

5820 ExprResult ParseObjCNumericLiteral(SourceLocation AtLoc);

5821

5822

5823

5824

5825

5826

5827

5828

5829 ExprResult ParseObjCBooleanLiteral(SourceLocation AtLoc, bool ArgValue);

5830

5831 ExprResult ParseObjCArrayLiteral(SourceLocation AtLoc);

5832 ExprResult ParseObjCDictionaryLiteral(SourceLocation AtLoc);

5833

5834

5835

5836

5837

5838

5839 ExprResult ParseObjCBoxedExpr(SourceLocation AtLoc);

5840

5841

5842

5843

5844

5845 ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc);

5846

5847

5848

5849

5850

5851 ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc);

5852

5853

5854

5855

5856

5857 ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc);

5858

5859

5860

5861

5862

5863

5864 bool isSimpleObjCMessageExpression();

5865

5866

5867

5868

5869

5870

5871

5872

5873

5874

5875

5876

5877 ExprResult ParseObjCMessageExpression();

5878

5879

5880

5881

5882

5883

5884

5885

5886

5887

5888

5889

5890

5891

5892

5893

5894

5895

5896

5897

5898

5899

5900

5901

5902

5903

5904

5905

5906

5907

5908

5909

5910

5911

5912

5913

5914

5915

5916

5917

5918

5919 ExprResult ParseObjCMessageExpressionBody(SourceLocation LBracloc,

5920 SourceLocation SuperLoc,

5922 Expr *ReceiverExpr);

5923

5924

5925

5926

5927

5928

5929

5930

5931

5932

5933

5934

5935

5936

5937

5938

5939

5940

5941

5942

5943

5944

5945

5946

5947

5948 bool ParseObjCXXMessageReceiver(bool &IsExpr, void *&TypeOrExpr);

5949

5950

5951

5952

5953 enum class ParsedStmtContext;

5954

5955 StmtResult ParseObjCAtStatement(SourceLocation atLoc,

5956 ParsedStmtContext StmtCtx);

5957

5958

5959

5960

5961

5962

5963

5964

5965

5966

5967

5968

5969

5970

5971 StmtResult ParseObjCTryStmt(SourceLocation atLoc);

5972

5973

5974

5975

5976

5977

5978 StmtResult ParseObjCThrowStmt(SourceLocation atLoc);

5979

5980

5981

5982

5983

5984

5985 StmtResult ParseObjCSynchronizedStmt(SourceLocation atLoc);

5986

5987

5988

5989

5990

5991

5992 StmtResult ParseObjCAutoreleasePoolStmt(SourceLocation atLoc);

5993

5994

5995

5996

5997

5998

5999

6000

6001

6002

6003

6004

6005

6006

6007

6008

6009

6010

6011

6012

6013

6014

6015 void ParseObjCTypeQualifierList(ObjCDeclSpec &DS, DeclaratorContext Context);

6016

6017

6018

6019 bool isStartOfObjCClassMessageMissingOpenBracket();

6020

6021

6022

6023

6024

6025

6026

6027

6028

6029

6030

6031

6032

6033public:

6035

6036

6037

6038

6039

6040

6045

6046

6048

6049private:

6050

6051 bool OpenACCDirectiveParsing = false;

6052

6053

6054

6055 bool AllowOpenACCArraySections = false;

6056

6057

6058

6059 class OpenACCArraySectionRAII {

6061

6062 public:

6063 OpenACCArraySectionRAII(Parser &P) : P(P) {

6064 assert(!P.AllowOpenACCArraySections);

6065 P.AllowOpenACCArraySections = true;

6066 }

6067 ~OpenACCArraySectionRAII() {

6068 assert(P.AllowOpenACCArraySections);

6069 P.AllowOpenACCArraySections = false;

6070 }

6071 };

6072

6073

6074

6075

6076 struct OpenACCDirectiveParseInfo {

6078 SourceLocation StartLoc;

6079 SourceLocation DirLoc;

6080 SourceLocation LParenLoc;

6081 SourceLocation RParenLoc;

6082 SourceLocation EndLoc;

6083 SourceLocation MiscLoc;

6085 SmallVector<Expr *> Exprs;

6086 SmallVector<OpenACCClause *> Clauses;

6087

6088

6089 };

6090

6091 struct OpenACCWaitParseInfo {

6092 bool Failed = false;

6093 Expr *DevNumExpr = nullptr;

6094 SourceLocation QueuesLoc;

6095 SmallVector<Expr *> QueueIdExprs;

6096

6097 SmallVector<Expr *> getAllExprs() {

6098 SmallVector<Expr *> Out;

6099 Out.push_back(DevNumExpr);

6100 llvm::append_range(Out, QueueIdExprs);

6101 return Out;

6102 }

6103 };

6104 struct OpenACCCacheParseInfo {

6105 bool Failed = false;

6106 SourceLocation ReadOnlyLoc;

6107 SmallVector<Expr *> Vars;

6108 };

6109

6110

6111

6112 enum class OpenACCParseCanContinue { Cannot = 0, Can = 1 };

6113

6114

6115

6116

6117

6118 using OpenACCClauseParseResult =

6119 llvm::PointerIntPair<OpenACCClause *, 1, OpenACCParseCanContinue>;

6120

6121 OpenACCClauseParseResult OpenACCCanContinue();

6122 OpenACCClauseParseResult OpenACCCannotContinue();

6123 OpenACCClauseParseResult OpenACCSuccess(OpenACCClause *Clause);

6124

6125

6126

6127 OpenACCDirectiveParseInfo ParseOpenACCDirective();

6128

6129 ExprResult ParseOpenACCIDExpression();

6130

6131

6132

6133

6134

6135

6136

6137 OpenACCCacheParseInfo ParseOpenACCCacheVarList();

6138

6139

6140

6142

6143 using OpenACCVarParseResult = std::pair<ExprResult, OpenACCParseCanContinue>;

6144

6145

6146

6147

6148

6149

6150

6151

6152

6153

6156

6157

6160

6161

6162

6163

6164

6165

6166

6167

6168

6169 OpenACCClauseParseResult

6170 ParseOpenACCClauseParams(ArrayRef<const OpenACCClause *> ExistingClauses,

6172 SourceLocation ClauseLoc);

6173

6174

6175

6176 OpenACCClauseParseResult

6177 ParseOpenACCClause(ArrayRef<const OpenACCClause *> ExistingClauses,

6179

6180

6181

6182

6183

6184

6185

6186

6187 SmallVector<OpenACCClause *>

6189

6190

6191

6192

6193

6194

6195

6196 OpenACCWaitParseInfo ParseOpenACCWaitArgument(SourceLocation Loc,

6197 bool IsDirective);

6198

6199

6200

6201 std::variant<std::monostate, StringLiteral *, IdentifierInfo *>

6202 ParseOpenACCBindClauseArgument();

6203

6204

6205

6206

6207 using OpenACCIntExprParseResult =

6208 std::pair<ExprResult, OpenACCParseCanContinue>;

6209

6210

6213 SourceLocation Loc);

6214

6215

6217 SourceLocation Loc,

6218 llvm::SmallVectorImpl<Expr *> &IntExprs);

6219

6220

6221

6222

6223

6224

6225

6226

6227

6228

6229

6230

6231 bool ParseOpenACCDeviceTypeList(llvm::SmallVector &Archs);

6232

6233

6234

6235

6236

6237

6238

6239

6240

6241

6242

6243 OpenACCIntExprParseResult ParseOpenACCAsyncArgument(OpenACCDirectiveKind DK,

6245 SourceLocation Loc);

6246

6247

6248

6249

6250

6251

6252

6253

6254

6255

6257

6258

6260 llvm::SmallVectorImpl<Expr *> &SizeExprs);

6261

6262

6263

6264

6265

6266

6267

6268

6269

6270

6271

6272 bool ParseOpenACCGangArgList(SourceLocation GangLoc,

6273 llvm::SmallVectorImpl &GKs,

6274 llvm::SmallVectorImpl<Expr *> &IntExprs);

6275

6276 using OpenACCGangArgRes = std::pair<OpenACCGangKind, ExprResult>;

6277

6278

6279

6280 OpenACCGangArgRes ParseOpenACCGangArg(SourceLocation GangLoc);

6281

6282 ExprResult ParseOpenACCConditionExpr();

6284 ParseOpenACCAfterRoutineDecl(AccessSpecifier &AS, ParsedAttributes &Attrs,

6286 OpenACCDirectiveParseInfo &DirInfo);

6287 StmtResult ParseOpenACCAfterRoutineStmt(OpenACCDirectiveParseInfo &DirInfo);

6288

6289

6290

6291

6292

6293

6294

6295

6296

6297

6298

6299

6300

6301private:

6303

6304

6305 bool OpenMPDirectiveParsing = false;

6306

6307

6309

6310 void ReplayOpenMPAttributeTokens(CachedTokens &OpenMPTokens) {

6311

6312

6313 if (!OpenMPTokens.empty()) {

6314 PP.EnterToken(Tok, true);

6315 PP.EnterTokenStream(OpenMPTokens, true,

6316 true);

6318 }

6319 }

6320

6321

6322

6323

6324

6327 SourceLocation Loc);

6328

6329

6330

6331 void parseOMPTraitPropertyKind(OMPTraitProperty &TIProperty,

6332 llvm::omp::TraitSet Set,

6333 llvm::omp::TraitSelector Selector,

6334 llvm::StringMap &Seen);

6335

6336

6337 void parseOMPTraitSelectorKind(OMPTraitSelector &TISelector,

6338 llvm::omp::TraitSet Set,

6339 llvm::StringMap &Seen);

6340

6341

6342 void parseOMPTraitSetKind(OMPTraitSet &TISet,

6343 llvm::StringMap &Seen);

6344

6345

6346 void parseOMPContextProperty(OMPTraitSelector &TISelector,

6347 llvm::omp::TraitSet Set,

6348 llvm::StringMap &Seen);

6349

6350

6351

6352

6353

6354

6355 void parseOMPContextSelector(OMPTraitSelector &TISelector,

6356 llvm::omp::TraitSet Set,

6357 llvm::StringMap &SeenSelectors);

6358

6359

6360

6361

6362

6363

6364 void parseOMPContextSelectorSet(OMPTraitSet &TISet,

6365 llvm::StringMap &SeenSets);

6366

6367

6368

6369

6370

6371

6372 bool parseOMPContextSelectors(SourceLocation Loc, OMPTraitInfo &TI);

6373

6374

6375 bool parseOpenMPAppendArgs(SmallVectorImpl &InteropInfos);

6376

6377

6378

6379 bool parseOMPDeclareVariantMatchClause(SourceLocation Loc, OMPTraitInfo &TI,

6380 OMPTraitInfo *ParentTI);

6381

6382

6383

6385 SourceLocation Loc);

6386

6387

6388

6389

6390

6391

6392

6393

6394

6395

6396

6397

6398

6399

6400

6401

6402

6403

6404 void ParseOpenMPAssumesDirective(OpenMPDirectiveKind DKind,

6405 SourceLocation Loc);

6406

6407

6408 void ParseOpenMPEndAssumesDirective(SourceLocation Loc);

6409

6410

6411

6412

6413

6414

6415

6416

6417

6418

6419

6420

6421

6422

6423

6424

6425 void ParseOpenMPClauses(OpenMPDirectiveKind DKind,

6426 SmallVectorImpl<clang::OMPClause *> &Clauses,

6427 SourceLocation Loc);

6428

6429

6430 void ParseOMPDeclareTargetClauses(SemaOpenMP::DeclareTargetContextInfo &DTCI);

6431

6432

6433 void ParseOMPEndDeclareTargetDirective(OpenMPDirectiveKind BeginDKind,

6434 OpenMPDirectiveKind EndDKind,

6435 SourceLocation Loc);

6436

6437

6438

6439 void skipUntilPragmaOpenMPEnd(OpenMPDirectiveKind DKind);

6440

6441

6442

6443

6444

6445 void parseOMPEndDirective(OpenMPDirectiveKind BeginKind,

6446 OpenMPDirectiveKind ExpectedKind,

6447 OpenMPDirectiveKind FoundKind,

6448 SourceLocation MatchingLoc, SourceLocation FoundLoc,

6449 bool SkipUntilOpenMPEnd);

6450

6451

6452

6453

6454

6455

6456

6457

6458

6459

6460

6461

6462

6463

6464

6465

6466

6467

6468

6469

6470

6471

6472

6473

6474

6475

6476

6477

6478

6479

6480

6481

6482

6483

6484

6485

6486

6487

6488

6489 DeclGroupPtrTy ParseOpenMPDeclarativeDirectiveWithExtDecl(

6490 AccessSpecifier &AS, ParsedAttributes &Attrs, bool Delayed = false,

6492 Decl *TagDecl = nullptr);

6493

6494

6495

6496

6497

6498

6499

6500

6501

6502

6503

6504

6505

6506 DeclGroupPtrTy ParseOpenMPDeclareReductionDirective(AccessSpecifier AS);

6507

6508

6509

6510 void ParseOpenMPReductionInitializerForDecl(VarDecl *OmpPrivParm);

6511

6512

6513

6514

6515

6516

6517

6518

6519

6520

6521

6522 DeclGroupPtrTy ParseOpenMPDeclareMapperDirective(AccessSpecifier AS);

6523

6524

6525 TypeResult parseOpenMPDeclareMapperVarDecl(SourceRange &Range,

6526 DeclarationName &Name,

6527 AccessSpecifier AS = AS_none);

6528

6529

6530

6531

6532

6533

6534

6535

6536

6537

6538

6539

6540

6541 bool ParseOpenMPSimpleVarList(

6542 OpenMPDirectiveKind Kind,

6543 const llvm::function_ref<void(CXXScopeSpec &, DeclarationNameInfo)>

6544 &Callback,

6545 bool AllowScopeSpecifier);

6546

6547

6548

6549

6550

6551

6552

6553

6554

6555

6556

6557

6558

6559

6560

6561

6562

6563

6564

6565

6566

6567

6568

6569

6570

6571

6572

6573

6574

6575

6576

6577

6578

6579

6580

6581

6582

6583

6584

6585

6586

6587

6588

6589

6590

6591

6592

6593

6594 StmtResult ParseOpenMPDeclarativeOrExecutableDirective(

6595 ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective = false);

6596

6597

6598

6599

6600

6601

6602

6603

6604 StmtResult

6605 ParseOpenMPExecutableDirective(ParsedStmtContext StmtCtx,

6606 OpenMPDirectiveKind DKind, SourceLocation Loc,

6607 bool ReadDirectiveWithinMetadirective);

6608

6609

6610

6611

6612

6613

6614

6615

6616 StmtResult ParseOpenMPInformationalDirective(

6617 ParsedStmtContext StmtCtx, OpenMPDirectiveKind DKind, SourceLocation Loc,

6618 bool ReadDirectiveWithinMetadirective);

6619

6620

6621

6622

6623

6624

6625

6626

6627

6628

6629

6630

6631

6632

6633

6634

6635

6636

6637

6638

6639

6640

6641

6642

6643

6644

6645

6646

6647 OMPClause *ParseOpenMPClause(OpenMPDirectiveKind DKind,

6649

6650

6651

6652

6653

6654

6655

6656

6657

6658

6659

6660

6661

6662

6663

6664

6665

6666

6667

6668

6669

6670

6671

6672

6673

6674

6675

6676

6677

6678

6679

6680

6681

6682

6683

6684

6685

6686

6687

6688

6689

6690

6691

6692

6693

6694

6695

6696

6697

6698

6699

6700

6701

6702 OMPClause *ParseOpenMPSingleExprClause(OpenMPClauseKind Kind, bool ParseOnly);

6703

6704

6705

6706

6707

6708

6709

6710

6711

6712

6713

6714

6715

6716

6717

6718

6719

6720

6721

6722

6723

6724 OMPClause *ParseOpenMPSimpleClause(OpenMPClauseKind Kind, bool ParseOnly);

6725

6726

6727

6728

6729

6730

6731

6732 bool ParseOpenMPIndirectClause(SemaOpenMP::DeclareTargetContextInfo &DTCI,

6733 bool ParseOnly);

6734

6735

6736

6737

6738

6739

6740

6741

6742

6743

6744

6745

6746

6747

6748

6749

6750

6751

6752

6753

6754

6755

6756

6757 OMPClause *ParseOpenMPSingleExprWithArgClause(OpenMPDirectiveKind DKind,

6759 bool ParseOnly);

6760

6761

6762 OMPClause *ParseOpenMPLoopRangeClause();

6763

6764

6765 OMPClause *ParseOpenMPSizesClause();

6766

6767

6768 OMPClause *ParseOpenMPPermutationClause();

6769

6770

6771

6772

6773

6774

6775

6776

6777

6778

6779

6780

6781

6782

6783

6784

6785

6786

6787

6788

6789

6790

6791

6792

6793

6794

6795

6796

6797

6798

6799

6800

6801

6802 OMPClause *ParseOpenMPClause(OpenMPClauseKind Kind, bool ParseOnly = false);

6803

6804

6805

6806

6807

6808

6809

6810

6811

6812

6813

6814

6815

6816

6817

6818

6819

6820

6821

6822

6823

6824

6825

6826

6827

6828

6829

6830

6831

6832

6833

6834

6835

6836

6837

6838

6839

6840

6841

6842

6843

6844

6845

6846

6847

6848

6849

6850

6851

6852

6853

6854

6855

6856

6857

6858

6859

6860

6861

6862

6863

6864

6865

6866

6867

6868

6869

6870

6871

6872 OMPClause *ParseOpenMPVarListClause(OpenMPDirectiveKind DKind,

6874

6875

6876

6877

6878

6879

6880

6881

6882

6883

6884

6886 SourceLocation &ClauseNameLoc,

6887 SourceLocation &OpenLoc,

6888 SourceLocation &CloseLoc,

6889 SmallVectorImpl<Expr *> &Exprs,

6890 bool ReqIntConst = false);

6891

6892

6893

6894

6895

6896

6897

6898 ExprResult ParseOpenMPIteratorsExpr();

6899

6900

6901

6902

6903

6904

6905 OMPClause *ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind);

6906

6907

6908 bool ParseOMPInteropInfo(OMPInteropInfo &InteropInfo, OpenMPClauseKind Kind);

6909

6910

6911

6912

6913

6914

6915

6916

6917

6918

6919

6920

6921

6922

6923

6924

6925

6926

6927

6928

6929

6930

6931

6932

6933

6934

6935

6936

6937

6938

6939 OMPClause *ParseOpenMPInteropClause(OpenMPClauseKind Kind, bool ParseOnly);

6940

6941

6942

6943

6944

6945

6946 OMPClause *ParseOpenMPOMPXAttributesClause(bool ParseOnly);

6947

6948public:

6949

6950

6951

6953 bool IsAddressOfOperand = false);

6954

6955

6957 SemaOpenMP::OpenMPVarListDataTy &Data,

6958 const LangOptions &LangOpts);

6959

6961 SmallVectorImpl<Expr *> &Vars,

6962 SemaOpenMP::OpenMPVarListDataTy &Data);

6963

6964

6966

6967

6968

6969

6970

6971

6973

6974

6975

6976

6977

6978

6979

6980

6981

6983

6984

6985

6986

6987

6988

6989

6990

6991

6992

6993

6994

6995

6996private:

6997 std::unique_ptr AlignHandler;

6998 std::unique_ptr GCCVisibilityHandler;

6999 std::unique_ptr OptionsHandler;

7000 std::unique_ptr PackHandler;

7001 std::unique_ptr MSStructHandler;

7002 std::unique_ptr UnusedHandler;

7003 std::unique_ptr WeakHandler;

7004 std::unique_ptr RedefineExtnameHandler;

7005 std::unique_ptr FPContractHandler;

7006 std::unique_ptr OpenCLExtensionHandler;

7007 std::unique_ptr OpenMPHandler;

7008 std::unique_ptr OpenACCHandler;

7009 std::unique_ptr PCSectionHandler;

7010 std::unique_ptr MSCommentHandler;

7011 std::unique_ptr MSDetectMismatchHandler;

7012 std::unique_ptr FPEvalMethodHandler;

7013 std::unique_ptr FloatControlHandler;

7014 std::unique_ptr MSPointersToMembers;

7015 std::unique_ptr MSVtorDisp;

7016 std::unique_ptr MSInitSeg;

7017 std::unique_ptr MSDataSeg;

7018 std::unique_ptr MSBSSSeg;

7019 std::unique_ptr MSConstSeg;

7020 std::unique_ptr MSCodeSeg;

7021 std::unique_ptr MSSection;

7022 std::unique_ptr MSStrictGuardStackCheck;

7023 std::unique_ptr MSRuntimeChecks;

7024 std::unique_ptr MSIntrinsic;

7025 std::unique_ptr MSFunction;

7026 std::unique_ptr MSOptimize;

7027 std::unique_ptr MSFenvAccess;

7028 std::unique_ptr MSAllocText;

7029 std::unique_ptr CUDAForceHostDeviceHandler;

7030 std::unique_ptr OptimizeHandler;

7031 std::unique_ptr LoopHintHandler;

7032 std::unique_ptr UnrollHintHandler;

7033 std::unique_ptr NoUnrollHintHandler;

7034 std::unique_ptr UnrollAndJamHintHandler;

7035 std::unique_ptr NoUnrollAndJamHintHandler;

7036 std::unique_ptr FPHandler;

7037 std::unique_ptr STDCFenvAccessHandler;

7038 std::unique_ptr STDCFenvRoundHandler;

7039 std::unique_ptr STDCCXLIMITHandler;

7040 std::unique_ptr STDCUnknownHandler;

7041 std::unique_ptr AttributePragmaHandler;

7042 std::unique_ptr MaxTokensHerePragmaHandler;

7043 std::unique_ptr MaxTokensTotalPragmaHandler;

7044 std::unique_ptr RISCVPragmaHandler;

7045

7046

7047 void initializePragmaHandlers();

7048

7049

7050 void resetPragmaHandlers();

7051

7052

7053

7054

7055

7056

7057 void HandlePragmaUnused();

7058

7059

7060

7061 void HandlePragmaVisibility();

7062

7063

7064

7065 void HandlePragmaPack();

7066

7067

7068

7069 void HandlePragmaMSStruct();

7070

7071 void HandlePragmaMSPointersToMembers();

7072

7073 void HandlePragmaMSVtorDisp();

7074

7075 void HandlePragmaMSPragma();

7076 bool HandlePragmaMSSection(StringRef PragmaName,

7077 SourceLocation PragmaLocation);

7078 bool HandlePragmaMSSegment(StringRef PragmaName,

7079 SourceLocation PragmaLocation);

7080

7081

7082 bool HandlePragmaMSInitSeg(StringRef PragmaName,

7083 SourceLocation PragmaLocation);

7084

7085

7086

7087

7088 bool HandlePragmaMSStrictGuardStackCheck(StringRef PragmaName,

7089 SourceLocation PragmaLocation);

7090 bool HandlePragmaMSFunction(StringRef PragmaName,

7091 SourceLocation PragmaLocation);

7092 bool HandlePragmaMSAllocText(StringRef PragmaName,

7093 SourceLocation PragmaLocation);

7094

7095

7096 bool HandlePragmaMSOptimize(StringRef PragmaName,

7097 SourceLocation PragmaLocation);

7098

7099

7100 bool HandlePragmaMSIntrinsic(StringRef PragmaName,

7101 SourceLocation PragmaLocation);

7102

7103

7104

7105 void HandlePragmaAlign();

7106

7107

7108

7109 void HandlePragmaDump();

7110

7111

7112

7113 void HandlePragmaWeak();

7114

7115

7116

7117 void HandlePragmaWeakAlias();

7118

7119

7120

7121 void HandlePragmaRedefineExtname();

7122

7123

7124

7125 void HandlePragmaFPContract();

7126

7127

7128

7129 void HandlePragmaFEnvAccess();

7130

7131

7132

7133 void HandlePragmaFEnvRound();

7134

7135

7136

7137 void HandlePragmaCXLimitedRange();

7138

7139

7140

7141 void HandlePragmaFloatControl();

7142

7143

7144

7145 void HandlePragmaFP();

7146

7147

7148

7149 void HandlePragmaOpenCLExtension();

7150

7151

7152

7153 StmtResult HandlePragmaCaptured();

7154

7155

7156

7157 bool HandlePragmaLoopHint(LoopHint &Hint);

7158

7159 bool ParsePragmaAttributeSubjectMatchRuleSet(

7161 SourceLocation &AnyLoc, SourceLocation &LastMatchRuleEndLoc);

7162

7163 void HandlePragmaAttribute();

7164

7165

7166

7167

7168

7169

7170

7171

7172

7173

7174

7175

7176

7177public:

7178

7180

7181

7182

7183

7185

7186 private:

7187

7188

7189 enum class ParsedStmtContext {

7190

7191

7192 AllowDeclarationsInC = 0x1,

7193

7194 AllowStandaloneOpenMPDirectives = 0x2,

7195

7196 InStmtExpr = 0x4,

7197

7198

7199 SubStmt = 0,

7200

7201 Compound = AllowDeclarationsInC | AllowStandaloneOpenMPDirectives,

7202

7204 };

7205

7206

7207

7208

7210

7211

7212

7213

7214

7215

7217 ParseStatement(SourceLocation *TrailingElseLoc = nullptr,

7218 ParsedStmtContext StmtCtx = ParsedStmtContext::SubStmt,

7219 LabelDecl *PrecedingLabel = nullptr);

7220

7221

7222

7223

7224

7225

7226

7227

7228

7229

7230

7231

7232

7233

7234

7235

7236

7237

7238

7239

7240

7241

7242

7243

7244

7245

7246

7247

7248

7249

7250

7251

7252

7253

7254

7255

7256

7257

7258

7259

7260

7261

7262

7263

7264

7265

7266

7267

7268

7269

7270

7271

7273 ParseStatementOrDeclaration(StmtVector &Stmts, ParsedStmtContext StmtCtx,

7275 LabelDecl *PrecedingLabel = nullptr);

7276

7277 StmtResult ParseStatementOrDeclarationAfterAttributes(

7278 StmtVector &Stmts, ParsedStmtContext StmtCtx,

7281

7282

7283 StmtResult ParseExprStatement(ParsedStmtContext StmtCtx);

7284

7285

7286

7287

7288

7289

7290

7291

7292

7293

7294

7295

7297 ParsedStmtContext StmtCtx);

7298

7299

7300

7301

7302

7303

7304

7305

7306 StmtResult ParseCaseStatement(ParsedStmtContext StmtCtx,

7307 bool MissingCase = false,

7309

7310

7311

7312

7313

7314

7315

7316

7317 StmtResult ParseDefaultStatement(ParsedStmtContext StmtCtx);

7318

7319 StmtResult ParseCompoundStatement(bool isStmtExpr = false);

7320

7321

7322

7323

7324

7325

7326

7327

7328

7329

7330

7331

7332

7333

7334

7335

7336

7337

7338

7339

7340

7341

7342

7343

7344

7345 StmtResult ParseCompoundStatement(bool isStmtExpr, unsigned ScopeFlags);

7346

7347

7348

7349

7350 void ParseCompoundStatementLeadingPragmas();

7351

7352 void DiagnoseLabelAtEndOfCompoundStatement();

7353

7354

7355

7356 bool ConsumeNullStmt(StmtVector &Stmts);

7357

7358

7359

7360

7361

7362 StmtResult ParseCompoundStatementBody(bool isStmtExpr = false);

7363

7364

7365

7366

7367

7368

7369

7370

7371

7372

7373

7374

7375

7376

7377

7378

7379

7380 bool ParseParenExprOrCondition(StmtResult *InitStmt,

7385

7386

7387

7388

7389

7390

7391

7392

7393

7394

7395

7396

7398

7399

7400

7401

7402

7403

7404

7407

7408

7409

7410

7411

7412

7413

7416

7417

7418

7419

7420

7421

7422

7424

7425

7426

7427

7428

7429

7430

7431

7432

7433

7434

7435

7436

7437

7438

7439

7440

7441

7442

7443

7444

7445

7446

7447

7448

7449

7452

7453

7454

7455

7456

7457

7458

7459

7460

7461

7463

7464

7465

7466

7467

7468

7469

7470

7471

7472

7473 StmtResult ParseContinueStatement();

7474

7475

7476

7477

7478

7479

7480

7481

7482

7483

7485

7486

7487

7488

7489

7490

7491

7492

7493

7495

7496 StmtResult ParseBreakOrContinueStatement(bool IsContinue);

7497

7498

7499

7500

7501

7502

7503

7504

7505

7507

7508 StmtResult ParsePragmaLoopHint(StmtVector &Stmts, ParsedStmtContext StmtCtx,

7512

7513 void ParseMicrosoftIfExistsStatement(StmtVector &Stmts);

7514

7515

7516

7517

7518

7519

7520

7521

7522

7523

7524

7526

7527

7528

7529

7530

7531

7532

7533

7534

7535

7536

7537

7538

7539

7540

7541

7542

7543

7544

7546

7547

7548

7549

7550

7551

7552

7553

7554

7555

7556

7557

7558

7559

7560 StmtResult ParseCXXCatchBlock(bool FnCatch = false);

7561

7562

7563

7564

7565

7566

7567

7568

7569

7570

7571

7572

7573

7574

7575

7577

7578

7579

7580

7581

7582

7583

7584

7586

7587

7588

7589

7590

7591

7592

7593

7595

7596 StmtResult ParseSEHLeaveStatement();

7597

7598 Decl *ParseFunctionStatementBody(Decl *Decl, ParseScope &BodyScope);

7599

7600

7601

7602

7603

7604

7605

7606

7607 Decl *ParseFunctionTryBlock(Decl *Decl, ParseScope &BodyScope);

7608

7609

7610

7611

7612

7613 bool trySkippingFunctionBody();

7614

7615

7616

7617

7618

7619

7620

7621 bool isDeclarationStatement(bool DisambiguatingWithExpression = false) {

7623 return isCXXDeclarationStatement(DisambiguatingWithExpression);

7625 }

7626

7627

7628

7629

7630

7631 bool isForInitDeclaration() {

7635 return Tok.is(tok::kw_using) ||

7636 isCXXSimpleDeclaration(true);

7638 }

7639

7640

7641 bool isForRangeIdentifier();

7642

7643

7644

7645

7646

7647

7648

7649

7650

7651

7652

7653

7654

7655public:

7656

7658 unsigned &NumLineToksConsumed,

7659 bool IsUnevaluated);

7660

7661private:

7662

7663

7664

7665

7666

7667

7668

7669

7670

7671

7672

7673

7674

7675

7676

7677

7678

7679

7680

7681

7682

7683 StmtResult ParseAsmStatement(bool &msAsm);

7684

7685

7686

7687

7688

7689

7690

7691

7692

7693

7694

7695

7696

7697

7698

7699

7700

7701

7702 StmtResult ParseMicrosoftAsmStatement(SourceLocation AsmLoc);

7703

7704

7705

7706

7707

7708

7709

7710

7711

7712

7713

7714

7715

7716

7717

7718 bool ParseAsmOperandsOpt(SmallVectorImpl<IdentifierInfo *> &Names,

7719 SmallVectorImpl<Expr *> &Constraints,

7720 SmallVectorImpl<Expr *> &Exprs);

7721

7722 class GNUAsmQualifiers {

7723 unsigned Qualifiers = AQ_unspecified;

7724

7725 public:

7726 enum AQ {

7727 AQ_unspecified = 0,

7728 AQ_volatile = 1,

7729 AQ_inline = 2,

7730 AQ_goto = 4,

7731 };

7732 static const char *getQualifierName(AQ Qualifier);

7733 bool setAsmQualifier(AQ Qualifier);

7734 inline bool isVolatile() const { return Qualifiers & AQ_volatile; };

7735 inline bool isInline() const { return Qualifiers & AQ_inline; };

7736 inline bool isGoto() const { return Qualifiers & AQ_goto; }

7737 };

7738

7739

7740 bool isGCCAsmStatement(const Token &TokAfterAsm) const;

7741

7742 bool isGNUAsmQualifier(const Token &TokAfterAsm) const;

7743 GNUAsmQualifiers::AQ getGNUAsmQualifier(const Token &Tok) const;

7744

7745

7746

7747

7748

7749

7750

7751

7752

7753

7754

7755

7756 bool parseGNUAsmQualifierListOpt(GNUAsmQualifiers &AQ);

7757

7758

7759

7760

7761

7762

7763

7764

7765

7766

7767

7768

7769

7770public:

7772

7773

7774

7775

7777

7778private:

7779

7780 unsigned TemplateParameterDepth;

7781

7782

7783 class TemplateParameterDepthRAII {

7784 unsigned &Depth;

7785 unsigned AddedLevels;

7786

7787 public:

7788 explicit TemplateParameterDepthRAII(unsigned &Depth)

7789 : Depth(Depth), AddedLevels(0) {}

7790

7791 ~TemplateParameterDepthRAII() { Depth -= AddedLevels; }

7792

7793 void operator++() {

7794 ++Depth;

7795 ++AddedLevels;

7796 }

7797 void addDepth(unsigned D) {

7798 Depth += D;

7799 AddedLevels += D;

7800 }

7801 void setAddedDepth(unsigned D) {

7802 Depth = Depth - AddedLevels + D;

7803 AddedLevels = D;

7804 }

7805

7806 unsigned getDepth() const { return Depth; }

7807 unsigned getOriginalDepth() const { return Depth - AddedLevels; }

7808 };

7809

7810

7811

7812 SmallVector<TemplateIdAnnotation *, 16> TemplateIds;

7813

7814

7815

7816

7817

7818 bool DelayTemplateIdDestruction = false;

7819

7820 void MaybeDestroyTemplateIds() {

7821 if (DelayTemplateIdDestruction)

7822 return;

7823 if (!TemplateIds.empty() &&

7824 (Tok.is(tok::eof) || !PP.mightHavePendingAnnotationTokens()))

7825 DestroyTemplateIds();

7826 }

7827 void DestroyTemplateIds();

7828

7829

7830

7831 struct DestroyTemplateIdAnnotationsRAIIObj {

7833

7834 DestroyTemplateIdAnnotationsRAIIObj(Parser &Self) : Self(Self) {}

7835 ~DestroyTemplateIdAnnotationsRAIIObj() { Self.MaybeDestroyTemplateIds(); }

7836 };

7837

7838 struct DelayTemplateIdDestructionRAII {

7840 bool PrevDelayTemplateIdDestruction;

7841

7842 DelayTemplateIdDestructionRAII(Parser &Self,

7843 bool DelayTemplateIdDestruction) noexcept

7844 : Self(Self),

7845 PrevDelayTemplateIdDestruction(Self.DelayTemplateIdDestruction) {

7846 Self.DelayTemplateIdDestruction = DelayTemplateIdDestruction;

7847 }

7848

7849 ~DelayTemplateIdDestructionRAII() noexcept {

7850 Self.DelayTemplateIdDestruction = PrevDelayTemplateIdDestruction;

7851 }

7852 };

7853

7854

7855 SmallVector<const IdentifierInfo *, 8> TentativelyDeclaredIdentifiers;

7856

7857

7858

7859

7860

7861

7862

7863

7864

7865

7866

7867 struct AngleBracketTracker {

7868

7869

7870 enum Priority : unsigned short {

7871

7872 PotentialTypo = 0x0,

7873

7874 DependentName = 0x2,

7875

7876

7877 SpaceBeforeLess = 0x0,

7878

7879 NoSpaceBeforeLess = 0x1,

7880

7882 };

7883

7900

7902

7903

7904

7905

7906

7907

7909 Priority Prio) {

7910 if (!Locs.empty() && Locs.back().isActive(P)) {

7911 if (Locs.back().Priority <= Prio) {

7913 Locs.back().LessLoc = LessLoc;

7914 Locs.back().Priority = Prio;

7915 }

7916 } else {

7917 Locs.push_back({TemplateName, LessLoc, Prio, P.ParenCount,

7918 P.BracketCount, P.BraceCount});

7919 }

7920 }

7921

7922

7923

7924

7925 void clear(Parser &P) {

7926 while (!Locs.empty() && Locs.back().isActiveOrNested(P))

7927 Locs.pop_back();

7928 }

7929

7930

7931

7933 if (!Locs.empty() && Locs.back().isActive(P))

7934 return &Locs.back();

7935 return nullptr;

7936 }

7937 };

7938

7939 AngleBracketTracker AngleBrackets;

7940

7941

7942

7943

7944 struct ParsedTemplateInfo {

7945 ParsedTemplateInfo()

7947

7949 bool isSpecialization,

7950 bool lastParameterListWasEmpty = false)

7953 TemplateParams(TemplateParams),

7954 LastParameterListWasEmpty(lastParameterListWasEmpty) {}

7955

7956 explicit ParsedTemplateInfo(SourceLocation ExternLoc,

7957 SourceLocation TemplateLoc)

7959 TemplateParams(nullptr), ExternLoc(ExternLoc),

7960 TemplateLoc(TemplateLoc), LastParameterListWasEmpty(false) {}

7961

7963

7964

7965

7967

7968

7969

7970 SourceLocation ExternLoc;

7971

7972

7973

7974 SourceLocation TemplateLoc;

7975

7976

7977 bool LastParameterListWasEmpty;

7978

7979 SourceRange getSourceRange() const LLVM_READONLY;

7980 };

7981

7982

7983 void LexTemplateFunctionForLateParsing(CachedTokens &Toks);

7984

7985

7986 void ParseLateTemplatedFuncDef(LateParsedTemplate &LPT);

7987

7988 static void LateTemplateParserCallback(void *P, LateParsedTemplate &LPT);

7989

7990

7991

7992

7993

7995

7996 void checkPotentialAngleBracket(ExprResult &PotentialTemplateName);

7997 bool checkPotentialAngleBracketDelimiter(const AngleBracketTracker::Loc &,

7998 const Token &OpToken);

7999 bool checkPotentialAngleBracketDelimiter(const Token &OpToken) {

8000 if (auto *Info = AngleBrackets.getCurrent(*this))

8001 return checkPotentialAngleBracketDelimiter(*Info, OpToken);

8002 return false;

8003 }

8004

8005

8006

8007

8008

8009

8012 SourceLocation &DeclEnd,

8013 ParsedAttributes &AccessAttrs);

8014

8015

8016

8017

8018

8019

8020

8021

8022

8023

8024

8025

8026

8027

8028

8029

8030

8031

8032

8033

8034

8035

8036

8037

8038

8039

8040

8041 DeclGroupPtrTy ParseTemplateDeclarationOrSpecialization(

8044

8047

8048

8049

8050

8051

8052

8053

8054

8055

8056

8057

8060 ParsingDeclRAIIObject &DiagsFromParams, SourceLocation &DeclEnd,

8062

8063

8064

8065

8066

8067

8068

8069

8070

8071

8072 bool ParseTemplateParameters(MultiParseScope &TemplateScopes, unsigned Depth,

8073 SmallVectorImpl<NamedDecl *> &TemplateParams,

8074 SourceLocation &LAngleLoc,

8075 SourceLocation &RAngleLoc);

8076

8077

8078

8079

8080

8081

8082

8083

8084

8085

8086

8087 bool ParseTemplateParameterList(unsigned Depth,

8088 SmallVectorImpl<NamedDecl *> &TemplateParams);

8089

8090 enum class TPResult;

8091

8092

8093

8094 TPResult isStartOfTemplateTypeParameter();

8095

8096

8097

8098

8099

8100

8101

8102

8103

8104

8105

8106

8107

8108

8109

8110

8111

8112

8113

8114

8115

8116

8117

8118 NamedDecl *ParseTemplateParameter(unsigned Depth, unsigned Position);

8119

8120

8121

8122

8123

8124

8125

8126

8127

8128

8129

8130

8131 NamedDecl *ParseTypeParameter(unsigned Depth, unsigned Position);

8132

8133

8134

8135

8136

8137

8138

8139

8140

8141

8142

8143

8144

8145

8146

8147 NamedDecl *ParseTemplateTemplateParameter(unsigned Depth, unsigned Position);

8148

8149

8150

8151

8152

8153

8154

8155

8156

8157 NamedDecl *ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position);

8158

8159

8160

8161 bool isTypeConstraintAnnotation();

8162

8163

8164

8165

8166

8167

8168

8169

8170

8171

8172

8173 bool TryAnnotateTypeConstraint();

8174

8175 void DiagnoseMisplacedEllipsis(SourceLocation EllipsisLoc,

8176 SourceLocation CorrectLoc,

8177 bool AlreadyHasEllipsis,

8178 bool IdentifierHasName);

8179 void DiagnoseMisplacedEllipsisInDeclarator(SourceLocation EllipsisLoc,

8180 Declarator &D);

8181

8182 typedef SmallVector<ParsedTemplateArgument, 16> TemplateArgList;

8183

8184

8185

8186

8187

8188

8189

8190

8191

8192

8193

8194

8195

8196

8197

8198

8199 bool ParseGreaterThanInTemplateList(SourceLocation LAngleLoc,

8200 SourceLocation &RAngleLoc,

8201 bool ConsumeLastToken,

8202 bool ObjCGenericList);

8203

8204

8205

8206

8207

8208

8209

8210

8211

8212

8213

8214

8215 bool ParseTemplateIdAfterTemplateName(bool ConsumeLastToken,

8216 SourceLocation &LAngleLoc,

8217 TemplateArgList &TemplateArgs,

8218 SourceLocation &RAngleLoc,

8220

8221

8222

8223

8224

8225

8226

8227

8228

8229

8230

8231

8232

8233

8234

8235

8236

8237

8238

8239

8240

8241

8242

8243

8244

8245

8246

8247

8248

8249

8250

8251

8252

8253

8254

8255

8256

8257

8258

8259

8260

8261

8263 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,

8265 bool AllowTypeAnnotation = true,

8266 bool TypeConstraint = false);

8267

8268

8269

8270

8271

8272

8273

8274

8275

8276

8277

8278

8279

8280

8281

8282

8283 void

8284 AnnotateTemplateIdTokenAsType(CXXScopeSpec &SS,

8286 bool IsClassName = false);

8287

8288

8289

8290

8291

8292

8293

8294

8295

8296

8297

8298 bool ParseTemplateArgumentList(TemplateArgList &TemplateArgs,

8300

8301

8302 ParsedTemplateArgument ParseTemplateTemplateArgument();

8303

8304

8305

8306

8307

8308

8309

8310

8311

8312

8313

8314 ParsedTemplateArgument ParseTemplateArgument();

8315

8316

8317

8318

8319

8320

8321

8322

8323

8324

8326 SourceLocation ExternLoc,

8327 SourceLocation TemplateLoc,

8328 SourceLocation &DeclEnd,

8329 ParsedAttributes &AccessAttrs,

8331

8332

8333

8334

8335

8336

8337

8338 Decl *ParseConceptDefinition(const ParsedTemplateInfo &TemplateInfo,

8339 SourceLocation &DeclEnd);

8340

8341

8342

8343

8344

8345

8346

8347

8348

8349

8350

8351

8352

8353private:

8354

8355

8356

8357

8358

8359

8360

8361

8362

8363

8364

8365

8366

8367 class TentativeParsingAction {

8368 Parser &P;

8369 PreferredTypeBuilder PrevPreferredType;

8370 Token PrevTok;

8371 size_t PrevTentativelyDeclaredIdentifierCount;

8372 unsigned short PrevParenCount, PrevBracketCount, PrevBraceCount;

8373 bool isActive;

8374

8375 public:

8376 explicit TentativeParsingAction(Parser &p, bool Unannotated = false)

8377 : P(p), PrevPreferredType(P.PreferredType) {

8378 PrevTok = P.Tok;

8379 PrevTentativelyDeclaredIdentifierCount =

8380 P.TentativelyDeclaredIdentifiers.size();

8381 PrevParenCount = P.ParenCount;

8382 PrevBracketCount = P.BracketCount;

8383 PrevBraceCount = P.BraceCount;

8384 P.PP.EnableBacktrackAtThisPos(Unannotated);

8385 isActive = true;

8386 }

8387 void Commit() {

8388 assert(isActive && "Parsing action was finished!");

8389 P.TentativelyDeclaredIdentifiers.resize(

8390 PrevTentativelyDeclaredIdentifierCount);

8391 P.PP.CommitBacktrackedTokens();

8392 isActive = false;

8393 }

8394 void Revert() {

8395 assert(isActive && "Parsing action was finished!");

8396 P.PP.Backtrack();

8397 P.PreferredType = PrevPreferredType;

8398 P.Tok = PrevTok;

8399 P.TentativelyDeclaredIdentifiers.resize(

8400 PrevTentativelyDeclaredIdentifierCount);

8401 P.ParenCount = PrevParenCount;

8402 P.BracketCount = PrevBracketCount;

8403 P.BraceCount = PrevBraceCount;

8404 isActive = false;

8405 }

8406 ~TentativeParsingAction() {

8407 assert(!isActive && "Forgot to call Commit or Revert!");

8408 }

8409 };

8410

8411

8412

8413 class RevertingTentativeParsingAction

8414 : private Parser::TentativeParsingAction {

8415 public:

8416 using TentativeParsingAction::TentativeParsingAction;

8417

8418 ~RevertingTentativeParsingAction() { Revert(); }

8419 };

8420

8421

8422

8423

8424

8425

8426

8427

8428

8429

8430

8431

8432

8433

8434

8435

8436

8437

8438

8439

8440

8441

8442

8443

8444

8445

8446

8447

8448

8449

8450

8451

8452

8453 bool isCXXDeclarationStatement(bool DisambiguatingWithExpression = false);

8454

8455

8456

8457

8458

8459

8460

8461

8462

8463

8464

8465

8466

8467

8468

8469

8470

8471

8472

8473

8474

8475

8476

8477

8478

8479 bool isCXXSimpleDeclaration(bool AllowForRangeDecl);

8480

8481

8482

8483

8484

8485

8486

8487

8488

8489

8490

8491

8492 bool isCXXFunctionDeclarator(bool *IsAmbiguous = nullptr,

8495

8496 struct ConditionDeclarationOrInitStatementState;

8497 enum class ConditionOrInitStatement {

8498 Expression,

8499 ConditionDecl,

8500 InitStmtDecl,

8501 ForRangeDecl,

8502 Error

8503 };

8504

8505

8506

8507

8508

8509

8510

8511

8512

8513

8514

8515

8516

8517

8518

8519

8520

8521

8522

8523

8524 ConditionOrInitStatement

8525 isCXXConditionDeclarationOrInitStatement(bool CanBeInitStmt,

8526 bool CanBeForRangeDecl);

8527

8528

8529

8530

8531

8532

8533

8534

8535

8536

8537

8538

8539

8540

8541

8542

8543

8544

8545

8546

8547

8549

8551 bool isAmbiguous;

8552 return isCXXTypeId(Context, isAmbiguous);

8553 }

8554

8555

8556

8558

8559

8560

8561

8562

8563

8564

8565

8566 bool isEnumBase(bool AllowSemi);

8567

8568

8569

8570

8571

8572

8573

8574

8575

8576

8577

8578

8579

8580

8581

8582

8583

8584

8585

8586

8587

8588

8589

8590

8591

8592

8593

8594

8595

8596

8597

8598

8599

8600

8601

8602

8603

8604

8605

8606

8607

8608

8609

8610

8611

8612

8613

8614

8615

8616

8617

8618

8619

8620

8621

8622

8623

8624

8625

8626

8627

8628

8629

8630

8631

8632

8633

8634

8635

8636

8637

8638

8639

8640

8641

8642

8643

8644

8645

8646

8647

8648

8649

8650

8651

8652

8653

8654

8655

8656

8657

8658

8659

8660

8661

8662

8663

8664

8665

8666

8667

8668

8669

8670

8671

8672

8673

8674

8675

8676

8677

8678

8679

8680

8681

8682

8683

8684 TPResult

8686 TPResult BracedCastResult = TPResult::False,

8687 bool *InvalidAsDeclSpec = nullptr);

8688

8689

8690

8691

8692 bool isCXXDeclarationSpecifierAType();

8693

8694

8695

8696

8697

8698 TPResult isTemplateArgumentList(unsigned TokensToSkip);

8699

8700

8701

8702

8703 TPResult isExplicitBool();

8704

8705

8706

8707

8708 bool isTentativelyDeclared(IdentifierInfo *II);

8709

8710

8711

8712

8713

8714

8715

8716

8717

8718

8719

8720

8721

8722

8723

8724

8725

8726

8727 TPResult TryParseSimpleDeclaration(bool AllowForRangeDecl);

8728

8729

8730

8731

8732

8733

8734

8735 TPResult TryParseTypeofSpecifier();

8736

8737

8738

8739 TPResult TryParseProtocolQualifiers();

8740

8741 TPResult TryParsePtrOperatorSeq();

8742

8743

8744

8745

8746

8747

8748

8749

8750

8751

8752

8753

8754

8755

8756

8757

8758

8759

8760

8761

8762

8763 TPResult TryParseOperatorId();

8764

8765

8766

8767

8768

8769

8770

8771

8772

8773

8774

8775

8776

8777

8778

8779

8780

8781

8782

8783

8784

8785

8786

8787

8788

8789

8790

8791

8792

8793

8794 TPResult TryParseInitDeclaratorList(bool MayHaveTrailingReturnType = false);

8795

8796

8797

8798

8799

8800

8801

8802

8803

8804

8805

8806

8807

8808

8809

8810

8811

8812

8813

8814

8815

8816

8817

8818

8819

8820

8821

8822

8823

8824

8825

8826

8827

8828

8829

8830

8831

8832

8833

8834

8835

8836

8837

8838

8839

8840

8841

8842

8843

8844

8845

8846

8847

8848

8849

8850

8851 TPResult TryParseDeclarator(bool mayBeAbstract, bool mayHaveIdentifier = true,

8852 bool mayHaveDirectInit = false,

8853 bool mayHaveTrailingReturnType = false);

8854

8855

8856

8857

8858

8859

8860

8861

8862

8863

8864

8865

8866

8867

8868

8869

8870

8871

8872

8873

8874 TPResult TryParseParameterDeclarationClause(

8875 bool *InvalidAsDeclaration = nullptr, bool VersusTemplateArg = false,

8878

8879

8880

8881

8882

8883

8884

8885

8886

8887

8888

8889

8890

8891

8892 TPResult TryParseFunctionDeclarator(bool MayHaveTrailingReturnType = false);

8893

8894

8895

8896

8897

8898 bool NameAfterArrowIsNonType();

8899

8900

8901

8902

8903

8904 TPResult TryParseBracketDeclarator();

8905

8906

8907

8908 TPResult TryConsumeDeclarationSpecifier();

8909

8910

8911

8912 bool TrySkipAttributes();

8913

8914

8915

8916

8917

8918

8919

8920

8921

8922

8923

8924

8925

8926

8927

8928

8929

8930

8931

8932

8933

8934

8935

8936

8937

8938

8939

8940

8941

8942

8943

8944

8945

8946

8947

8948

8949

8950

8951

8952

8954 isCXX11AttributeSpecifier(bool Disambiguate = false,

8955 bool OuterMightBeMessageSend = false);

8956

8957

8958};