@@ -4413,6 +4413,38 @@ void Parser::ParseStructDeclaration(
4413
4413
}
4414
4414
}
4415
4415
4416
+ static std::string GetMangledName (const std::string& Base, const std::string& Variant) {
4417
+ return std::string (" __pp_struct_" )
4418
+ + Base + " __"
4419
+ + Variant;
4420
+ }
4421
+
4422
+ static std::string GetVariantName (Parser& P, const std::string& CurTokName, const Token& NextTok) {
4423
+ if (!P.getCurToken ().is (tok::identifier)) {
4424
+ llvm_unreachable (" pp-ext-expected-token-identifier" );
4425
+ return " <pp-ext-expected-token-identifier>" ;
4426
+ }
4427
+
4428
+ std::string MangledName;
4429
+ switch (NextTok.getKind ())
4430
+ {
4431
+ case tok::comma:
4432
+ case tok::greater:
4433
+ return CurTokName;
4434
+ break ;
4435
+ case tok::less:
4436
+ P.ConsumeToken (); // gen identifier
4437
+ P.ConsumeToken (); // less
4438
+ MangledName = GetMangledName (CurTokName, GetVariantName (P, CurTokName, P.NextToken ()));
4439
+ P.ConsumeToken (); // variant identifier
4440
+ return MangledName;
4441
+ default :
4442
+ llvm_unreachable (" pp-ext-error-name" );
4443
+ break ;
4444
+ }
4445
+ return " <pp-ext-error-name>" ;
4446
+ }
4447
+
4416
4448
Parser::SpecsVec Parser::TryParsePPExt (Decl *TagDecl,
4417
4449
SmallVector<Decl *, 32 >& FieldDecls,
4418
4450
const ParsedAttributes& Attrs) {
@@ -4421,27 +4453,28 @@ Parser::SpecsVec Parser::TryParsePPExt(Decl *TagDecl,
4421
4453
return Result;
4422
4454
}
4423
4455
4424
- auto DeclGenerator = [&](StringRef Name) {
4425
- auto * RD = cast<RecordDecl>(TagDecl);
4426
- auto MangledName = std::string (" __pp_struct_" )
4427
- + RD->getDeclName ().getAsString () + " __"
4428
- + Name.str ();
4429
- auto TestName = &PP.getIdentifierTable ().get (MangledName);
4456
+ auto DeclGenerator = [&](std::string BaseName, std::string VarName) {
4457
+ auto IdentifierName = &PP.getIdentifierTable ().get (VarName);
4430
4458
4431
4459
// TODO: Fill Fields
4432
4460
FieldList Fields;
4433
4461
4434
- return std::tuple<std::string, IdentifierInfo*, FieldList>{Name. str (), TestName , Fields};
4462
+ return std::tuple<std::string, IdentifierInfo*, FieldList>{BaseName, IdentifierName , Fields};
4435
4463
};
4436
4464
4437
4465
printf (" \n [PPMC] Parse extension\n " );
4438
4466
ConsumeAnyToken ();
4467
+ auto * RD = cast<RecordDecl>(TagDecl);
4468
+ const auto GenName = RD->getDeclName ().getAsString ();
4439
4469
while (Tok.isNot (clang::tok::greater)) {
4440
4470
printf (" Token -> Kind: [%s]" , Tok.getName ());
4441
4471
if (Tok.is (clang::tok::identifier)) {
4442
- auto Name = Tok.getIdentifierInfo ()->getName ().str ();
4443
- printf (" , Name:[%s]" , Name.c_str ());
4444
- auto D = DeclGenerator (Tok.getIdentifierInfo ()->getName ());
4472
+ const auto TokName = Tok.getIdentifierInfo ()->getName ().str ();
4473
+ auto Name = GetVariantName (*this ,
4474
+ GetMangledName (GenName, TokName),
4475
+ NextToken ());// Tok.getIdentifierInfo()->getName().str();
4476
+ printf (" , Name:[%s]" , TokName.c_str ());
4477
+ auto D = DeclGenerator (TokName, Name);
4445
4478
Result.push_back (D);
4446
4479
}
4447
4480
printf (" \n " );
@@ -4642,6 +4675,7 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
4642
4675
auto VariantName = std::get<0 >(SpecializationTuple);
4643
4676
auto VariantNameIdentifier = &PP.getIdentifierTable ().get (VariantName);
4644
4677
auto TestName = std::get<1 >(SpecializationTuple);
4678
+ printf (" [] Test name: %s, Variant Name: %s\n " , TestName->getNameStart (), VariantName.c_str ());
4645
4679
ParsingDeclSpec PDS (*this );
4646
4680
auto VariantDecl = Actions.ActOnTag (getCurScope (), clang::TST_struct, clang::Sema::TUK_Reference,
4647
4681
TestLocation, TestSS, VariantNameIdentifier, TestLocation, TestAttrs, clang::AS_none, TestLocation,
0 commit comments