def METHOD_NAME(self):
    # First we define a device function / kernel pair and run the usual
    # checks on the generated LLVM and PTX.
    @cuda.jit(lineinfo=True)
    def callee(x):
        x[0] += 1
    @cuda.jit(lineinfo=True)
    def caller(x):
        x[0] = 1
        callee(x)
    sig = (int32[:],)
    self._check(caller, sig=sig, expect=True)
    # Now we can check the PTX of the device function specifically.
    ptx = caller.inspect_asm(sig)
    ptxlines = ptx.splitlines()
    # Check that there is no device function in the PTX
    # A line beginning with ".weak .func" that identifies a device function
    devfn_start = re.compile(r'^\.weak\s+\.func')
    for line in ptxlines:
        if devfn_start.match(line) is not None:
            self.fail(f"Found device function in PTX:\n\n{ptx}")
    # Scan for .loc directives that refer to an inlined device function
    loc_directive = self._loc_directive_regex()
    found = False
    for line in ptxlines:
        if loc_directive.search(line) is not None:
            if 'inlined_at' in line:
                found = True
                break
    if not found:
        self.fail(f'No .loc directive with inlined_at info found'
                  f'in:\n\n{ptx}')
    # We also inspect the LLVM to ensure that there's debug info for each
    # subprogram (function). A lightweight way to check this is to ensure
    # that we have as many DISubprograms as we expect.
    llvm = caller.inspect_llvm(sig)
    subprograms = 0
    for line in llvm.splitlines():
        if 'distinct !DISubprogram' in line:
            subprograms += 1
    # One DISubprogram for each of:
    # - The kernel wrapper
    # - The caller
    # - The callee
    expected_subprograms = 3
    self.assertEqual(subprograms, expected_subprograms,
                     f'"Expected {expected_subprograms} DISubprograms; '
                     f'got {subprograms}')