From bcf10364708f934ba7766ccf9b066f59df7e8385 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Thu, 28 May 2020 16:18:56 -0400 Subject: [PATCH] [parser] fix parser for forward referenced types and incomplete interface types incomplete interfaces are initialized as incomplete class kind by default before knowing they are interfaces modified: src/maple_ir/src/parser.cpp --- src/maple_ir/src/parser.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/maple_ir/src/parser.cpp b/src/maple_ir/src/parser.cpp index aa382fea18..a2ed490eff 100644 --- a/src/maple_ir/src/parser.cpp +++ b/src/maple_ir/src/parser.cpp @@ -849,7 +849,7 @@ bool MIRParser::ParseStructType(TyIdx &styIdx) { MIRType *prevType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(styIdx); ASSERT(prevType->GetKind() == kTypeStruct || prevType->GetKind() == kTypeStructIncomplete, "type kind should be consistent."); - if (static_cast(prevType)->IsIncomplete() && !(structType.IsIncomplete())) { + if (prevType->IsIncomplete() && !(structType.IsIncomplete())) { structType.SetNameStrIdx(prevType->GetNameStrIdx()); structType.SetTypeIndex(styIdx); GlobalTables::GetTypeTable().SetTypeWithTyIdx(styIdx, *structType.CopyMIRTypeNode()); @@ -880,7 +880,7 @@ bool MIRParser::ParseClassType(TyIdx &styidx) { MIRType *prevType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(styidx); ASSERT(prevType->GetKind() == kTypeClass || prevType->GetKind() == kTypeClassIncomplete, "type kind should be consistent."); - if (static_cast(prevType)->IsIncomplete() && !(classType.IsIncomplete())) { + if (prevType->IsIncomplete() && !(classType.IsIncomplete())) { classType.SetNameStrIdx(prevType->GetNameStrIdx()); classType.SetTypeIndex(styidx); GlobalTables::GetTypeTable().SetTypeWithTyIdx(styidx, *classType.CopyMIRTypeNode()); @@ -921,9 +921,9 @@ bool MIRParser::ParseInterfaceType(TyIdx &sTyIdx) { } if (sTyIdx != 0u) { MIRType *prevType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(sTyIdx); - ASSERT(prevType->GetKind() == kTypeInterface || prevType->GetKind() == kTypeInterfaceIncomplete, + ASSERT(prevType->GetKind() == kTypeInterface || prevType->IsIncomplete(), "type kind should be consistent."); - if (static_cast(prevType)->IsIncomplete() && !(interfaceType.IsIncomplete())) { + if (prevType->IsIncomplete() && !(interfaceType.IsIncomplete())) { interfaceType.SetNameStrIdx(prevType->GetNameStrIdx()); interfaceType.SetTypeIndex(sTyIdx); GlobalTables::GetTypeTable().SetTypeWithTyIdx(sTyIdx, *interfaceType.CopyMIRTypeNode()); @@ -1511,9 +1511,6 @@ bool MIRParser::ParseTypedef() { Error("error passing derived type at "); return false; } - if (prevTyIdx != 0u) { - return true; - } // for class/interface types, prev_tyidx could also be set during processing // so we check again right before SetGStrIdxToTyIdx if (isLocal) { -- Gitee