anchor.diff:      // TODO(brianwilkerson) Validate that `f` is a top-level function.
       final DartType R = (T as FunctionType).returnType;
       if ((FT as FunctionType).returnType.isVoid ||
  -        _isPointer(R.element) ||
  -        _isHandle(R.element) ||
  -        _isStructClass(R)) {
  +        R.isPointer ||
  +        R.isHandle ||
  +        R.isStructSubtype) {
         if (argCount != 1) {
           _errorReporter.reportErrorForNode(
               FfiCode.INVALID_EXCEPTION_VALUE, node.argumentList.arguments[1]);
  
positive.code:       if (superName == _allocatorClassName) {
          return;
        }
        if (_isDartFfiClass(typename)) {
          _errorReporter.reportErrorForNode(
              subtypeOfFfiCode, typename, [node.name, typename.name]);
        } else if (_isSubtypeOfStruct(typename)) {
          _errorReporter.reportErrorForNode(
              subtypeOfStructCode, typename, [node.name, typename.name]);
        }
  
negative.code:         _validateAnnotations(fieldType, annotations, _PrimitiveDartType.int);
        } else if (declaredType.isDartCoreDouble) {
          _validateAnnotations(fieldType, annotations, _PrimitiveDartType.double);
        } else if (declaredType.isPointer) {
          _validateNoAnnotations(annotations);
        } else if (declaredType.isCArray) {
          final typeArg = (declaredType as InterfaceType).typeArguments.single;
          if (!_isSized(typeArg)) {
            _errorReporter.reportErrorForNode(FfiCode.NON_SIZED_TYPE_ARGUMENT,
                fieldType, [_cArrayClassName, typeArg.toString()]);
          }
          _validateSizeOfAnnotation(fieldType, annotations);
        } else if (declaredType.isStructSubtype) {
          final clazz = (declaredType as InterfaceType).element;
          if (clazz.isEmptyStruct) {
            _errorReporter
                .reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [clazz.name]);
          }
  