aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-03-30 01:37:13 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-03-30 01:37:13 +0000
commitcd5bd90a7bc0ccb1ffce5e7dc62b1976493038c4 (patch)
tree6706e3ada8bf467d2adf123414063ccff6a4f03a
parenta5ad78e7460a3134861ae132498de99ed947066e (diff)
For PR1289:
Check at the end of the parse that there are no unresolved types and no undefined values. Issue errors if there are. This gets rid of the need for implementation or checkpoint by ensuring you can't finish a parse with undefined things. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35499 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AsmParser/llvmAsmParser.y32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index 4271273573..308319639e 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -2950,6 +2950,38 @@ static Module* RunParser(Module * M) {
return 0;
}
+ // Emit an error if there are any unresolved types left.
+ if (!CurModule.LateResolveTypes.empty()) {
+ const ValID &DID = CurModule.LateResolveTypes.begin()->first;
+ if (DID.Type == ValID::LocalName) {
+ GenerateError("Undefined type remains at eof: '"+DID.getName() + "'");
+ } else {
+ GenerateError("Undefined type remains at eof: #" + itostr(DID.Num));
+ }
+ if (ParserResult)
+ delete ParserResult;
+ return 0;
+ }
+
+ // Emit an error if there are any unresolved values left.
+ if (!CurModule.LateResolveValues.empty()) {
+ Value *V = CurModule.LateResolveValues.back();
+ std::map<Value*, std::pair<ValID, int> >::iterator I =
+ CurModule.PlaceHolderInfo.find(V);
+
+ if (I != CurModule.PlaceHolderInfo.end()) {
+ ValID &DID = I->second.first;
+ if (DID.Type == ValID::LocalName) {
+ GenerateError("Undefined value remains at eof: "+DID.getName() + "'");
+ } else {
+ GenerateError("Undefined value remains at eof: #" + itostr(DID.Num));
+ }
+ if (ParserResult)
+ delete ParserResult;
+ return 0;
+ }
+ }
+
// Check to make sure that parsing produced a result
if (!ParserResult)
return 0;