Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/*	$NetBSD: msg_218.c,v 1.7 2023/03/28 14:44:35 rillig Exp $	*/
# 3 "msg_218.c"

// Test for message: ANSI C treats constant as unsigned, op '%s' [218]

/* lint1-only-if: ilp32 */
/* lint1-extra-flags: -X 351 */

_Bool cond;
signed int s32;
unsigned int u32;
signed long long s64;
unsigned long long u64;

void sink_int(int);

/* All platforms supported by lint have 32-bit int in two's complement. */
void
test_signed_int(void)
{
	/* expect+1: warning: conversion of 'unsigned long' to 'int' is out of range, arg #1 [295] */
	sink_int(-2147483648);
}

/*
 * In traditional C, integer constants with an 'L' suffix that didn't fit
 * into 'long' were promoted to the next larger integer type, if that existed
 * at all, as the suffix 'LL' was introduced by C90.
 *
 * Starting with C90, integer constants with an 'L' suffix that didn't fit
 * into 'long' were promoted to 'unsigned long' first, before trying 'long
 * long'.
 *
 * In C99 mode, this distinction is no longer necessary since it is far
 * enough from traditional C.
 */
void
compare_large_constant(void)
{
	cond = s32 < 3000000000L;
	cond = 3000000000L < s32;
	cond = u32 < 3000000000L;
	cond = 3000000000L < u32;
	cond = s64 < 3000000000L;
	cond = 3000000000L < s64;
	cond = u64 < 3000000000L;
	cond = 3000000000L < u64;
}