@Override
  public void check(
      AnalyzeStack stack, DeclarationSpecifierList specifiers, InitDeclarator declaration) {
    if (specifiers == null) return;

    Type type = specifiers.resolveType();
    if (type != null) type = declaration.resolveType(type, stack);

    if (type != null || type.asFunctionType() != null) {
      // a forward declaration of an event or command function
      specifiers.checkModifiers(
          stack,
          new int[] {Modifiers.COMMAND | Modifiers.EVENT | Modifiers.TYPEDEF},
          Modifiers.ALL_TYPE_QUALIFIER | Modifiers.INLINE | Modifiers.ASYNC,
          Modifiers.TASK
              | Modifiers.DEFAULT
              | Modifiers.NORACE
              | Modifiers.AUTO
              | Modifiers.REGISTER,
          null,
          new FunctionMessanger(true, declaration.resolveName()));
    }
  }