af426c7aa40aad4c5c6b532b02a1151dd42da305
galt
  Wed Jun 4 15:17:14 2014 -0700
Inside an errCatch block warnings which are not followed by an errAbort just get swallowed up and ignored. I added a flag to the structure that remembers that warnings have occurred.
diff --git src/lib/errCatch.c src/lib/errCatch.c
index eedadfd..adf13a4 100644
--- src/lib/errCatch.c
+++ src/lib/errCatch.c
@@ -67,60 +67,73 @@
 return (struct errCatch **)(&hel->val);
 }
 
 static void errCatchAbortHandler()
 /* semiAbort */
 {
 struct errCatch **pErrCatchStack = getStack(), *errCatchStack = *pErrCatchStack;
 errCatchStack->gotError = TRUE;
 longjmp(errCatchStack->jmpBuf, -1);
 }
 
 static void errCatchWarnHandler(char *format, va_list args)
 /* Write an error to top of errCatchStack. */
 {
 struct errCatch **pErrCatchStack = getStack(), *errCatchStack = *pErrCatchStack;
+errCatchStack->gotWarning = TRUE;
 dyStringVaPrintf(errCatchStack->message, format, args);
 dyStringAppendC(errCatchStack->message, '\n');
 }
 
 boolean errCatchPushHandlers(struct errCatch *errCatch)
 /* Push error handlers.  Not usually called directly. */
 {
 pushAbortHandler(errCatchAbortHandler);
 pushWarnHandler(errCatchWarnHandler);
 struct errCatch **pErrCatchStack = getStack();
 slAddHead(pErrCatchStack, errCatch);
 return TRUE;
 }
 
 void errCatchEnd(struct errCatch *errCatch)
 /* Restore error handlers and pop self off of catching stack. */
 {
 popWarnHandler();
 popAbortHandler();
 struct errCatch **pErrCatchStack = getStack(), *errCatchStack = *pErrCatchStack;
 if (errCatch != errCatchStack)
    errAbort("Mismatch between errCatch and errCatchStack");
 *pErrCatchStack = errCatch->next;
 }
 
+void errCatchReWarn(struct errCatch *errCatch)
+/* Re-warn any warnings that happened even though no abort happened 
+ * to make them visible. */
+{
+if (errCatch->gotWarning && !errCatch->gotError)
+    {
+    warn("%s", errCatch->message->string);
+    }
+}
+
 boolean errCatchFinish(struct errCatch **pErrCatch)
 /* Finish up error catching.  Report error if there is a
  * problem and return FALSE.  If no problem return TRUE.
  * This handles errCatchEnd and errCatchFree. */
 {
 struct errCatch *errCatch = *pErrCatch;
 boolean ok = TRUE;
 if (errCatch != NULL)
     {
     errCatchEnd(errCatch);
     if (errCatch->gotError)
 	{
 	ok = FALSE;
 	warn("%s", errCatch->message->string);
 	}
+    else
+	errCatchReWarn(errCatch);
     errCatchFree(pErrCatch);
     }
 return ok;
 }