diff --git a/sys/dev/uart/uart_cpu_arm64.c b/sys/dev/uart/uart_cpu_arm64.c --- a/sys/dev/uart/uart_cpu_arm64.c +++ b/sys/dev/uart/uart_cpu_arm64.c @@ -94,18 +94,28 @@ if (err == 0) return (0); + err = ENXIO; #ifdef DEV_ACPI /* Check if SPCR can tell us what console to use. */ if (uart_cpu_acpi_spcr(devtype, di) == 0) return (0); -#endif - err = ENXIO; +#ifndef FDT + /* + * In an ideal world, we'd just fall through and bail out because FDT + * isn't defined, thus `err` doesn't get reassigned and we immediately + * return. As of clang 14, later uses of `shift`, et al., raise + * warnings because it can't deduce that we're about to return. + */ + else + return (ENXIO); +#endif /* !FDT */ +#endif /* DEV_ACPI */ #ifdef FDT if (err != 0) { err = uart_cpu_fdt_probe(&class, &bst, &bsh, &br, &rclk, &shift, &iowidth, devtype); } -#endif +#endif /* FDT */ if (err != 0) return (err);