A slightly quirky one, I agree. However, the following code is confusing Quartus:
IF ci = '0' THEN
co <= aab;
ELSIF ci = '1' THEN
aob := axb XOR aab; -- the same as (a OR b)
co <= aob;
END IF;
Using 'ELSE' covers all other cases. By using 'ELSIF' Quartus believes there may be some other paths it must handle - even though there aren't in this case.
Change these lines to:
IF ci = '0' THEN
co <= aab;
ELSE
aob := axb XOR aab; -- the same as (a OR b)
co <= aob;
END IF;
I recommend you
always use an ELSE at the end of conditional statements that infer combinational logic.
Cheers,
Alex