 
       let selfSym: Symbol? = node.innerScope?.symbols["self"]?[0]
       if node.kind == .constructor {
-        guard selfSym != nil
-          else { fatalError("no symbol for 'self' in constructor scope") }
+        assert(selfSym != nil, "missing symbol for 'self' in constructor")
         locals.top![selfSym!] = builder.buildAlloc(type: fnTy.codomain, id: 0)
+      } else if node.symbol!.isMethod {
+        assert(selfSym != nil, "missing symbol for 'self' in method")
+        locals.top![selfSym!] = AIRParameter(
+          type: builder.unit.getType(of: selfSym!.type!),
+          id: builder.currentBlock!.nextRegisterID())
       }
 
       // Create the function parameters.

      // Note that arguments are captured by reference in the current frame.
      locals.top![node.symbol!] = builder.buildPartialApply(
        function: fn,
        arguments: node.captures
          .sorted(by: { a, b in a.name < b.name })
          .map({ locals.top![$0]! }),
        type: fnTy)
    }


      // Restore the insertion point.
      builder.currentBlock = previousBlock
      locals.pop()
    }

    // NOTE: Generic functions are represented unspecialized in AIR, so that borrow checking can be
