anchor.diff:            throw "The option `${showOption loc}' is used but not defined."
           else
             fold (def: res:
  -            if opt.type.check def.config then res
  +            if opt.type.check def.value then res
               else throw "The option value `${showOption loc}' in `${def.file}' is not a ${opt.type.name}.")
  -            (opt.type.merge (map (m: m.config) defsFinal)) defsFinal;
  +            (opt.type.merge (map (m: m.value) defsFinal)) defsFinal;
         # Finally, apply the ‘apply’ function to the merged
         # value.  This allows options to yield a value computed
         # from the definitions.
  
positive.code:                 (pushDownProperties (getAttr name m.config)))
              ) configs);
            nrOptions = count (m: isOption m.options) decls;
  
            defns2 = concatMap (m:
              optional (hasAttr name m.config)
                { inherit (m) file; config = getAttr name m.config; }
              ) configs;
          in
            if nrOptions == length decls then
              let opt = fixupOptionType loc' (mergeOptionDecls loc' decls);
              in evalOptionValue loc' opt defns2
            else if nrOptions != 0 then
              let
                firstOption = findFirst (m: isOption m.options) "" decls;
  
negative.code: 
    /* Merge all the definitions of an option to produce the final
       config value. */
    evalOptionValue = loc: opt: defs:
      let
        # Process mkOverride properties, adding in the default
        # value specified in the option declaration (if any).
        defsFinal = filterOverrides (optional (opt ? default) ({ file = head opt.declarations; value = mkOptionDefault opt.default; }) ++ defs);
        # Type-check the remaining definitions, and merge them if
        # possible.
        merged =
  