Index: generic/xotcl.c =================================================================== diff -u -rcfee325944ac90fe94485cba109a7e99465073b5 -r4e4a884ea235a004a6126e59aaf2593d899ba3f3 --- generic/xotcl.c (.../xotcl.c) (revision cfee325944ac90fe94485cba109a7e99465073b5) +++ generic/xotcl.c (.../xotcl.c) (revision 4e4a884ea235a004a6126e59aaf2593d899ba3f3) @@ -6306,6 +6306,7 @@ fprintf(stderr, "convertViaCmd converts %s to '%s'\n", ObjStr(objPtr), ObjStr(Tcl_GetObjResult(interp))); *clientData = (ClientData)Tcl_GetObjResult(interp); } + fprintf(stderr, "convertViaCmd returns %d\n",result); return result; } @@ -6566,7 +6567,7 @@ ObjStr(paramPtr->converterName), objectName(paramObj)); paramPtr->flags |= XOTCL_ARG_CURRENTLY_UNKNOWN; /* TODO: for the time being, we do not return an error here */ - } + } } /* @@ -12230,7 +12231,12 @@ result = ParamParse(interp, "valuecheck", fullParamObj, XOTCL_DISALLOWED_ARG_VALUEECHECK /* disallowed options */, paramPtr, &possibleUnknowns, &plainParams); - if (result == TCL_OK) { + /* Here, we want to treat currently unknown user level converters as + error. + */ + if (paramPtr->flags & XOTCL_ARG_CURRENTLY_UNKNOWN) { + result = TCL_ERROR; + } else if (result == TCL_OK) { TclFreeIntRep(objPtr); objPtr->internalRep.twoPtrValue.ptr1 = (void *)paramPtr; objPtr->internalRep.twoPtrValue.ptr2 = NULL; @@ -12265,6 +12271,7 @@ } result = ArgumentCheck(interp, value, paramPtr, &checkedData); + Tcl_SetIntObj(Tcl_GetObjResult(interp), (result == TCL_OK)); return TCL_OK; }