root/tests/usr.bin/xlint/lint1/msg_132_ilp32.c
/*      $NetBSD: msg_132_ilp32.c,v 1.5 2023/08/08 20:15:11 rillig Exp $ */
# 3 "msg_132_ilp32.c"

// Test for message: conversion from '%s' to '%s' may lose accuracy [132]

/*
 * On 32-bit platforms, it is possible to add a 64-bit integer to a 32-bit
 * pointer.  The 64-bit integer is then converted to the ptrdiff_t of the
 * target platform, which results in the non-obvious conversion from
 * 'long long' to either 'long' or 'int', depending on the platform's
 * ptrdiff_t.
 */

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

/*
 * Seen in usr.bin/make/var.c, function RegexReplace, in the function call
 * SepBuf_AddBytesBetween(buf, wp + m[0].rm_so, wp + m[0].rm_eo).  The
 * offsets of regular expression matches have type off_t, which is a 64-bit
 * integer.
 *
 * C11 6.5.6p8 does not explicitly define the meaning of a pointer + an
 * overly long integer, it just says "undefined behavior" if the resulting
 * pointer would be outside the object.
 */
const char *
array_subscript(const char *p, long long idx)
{
        /* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
        return p + idx;
}

/*
 * On ILP32 platforms, pointer, long and int have the same size, so there is
 * no loss of accuracy.
 */
unsigned int
convert_pointer_to_smaller_integer(void *ptr)
{
        return (unsigned long)(ptr) >> 12;
}

_Bool bool_var;
char char_var;
signed char schar_var;
unsigned char uchar_var;
short short_var;
unsigned short ushort_var;
int int_var;
unsigned int uint_var;
long long_var;
unsigned long ulong_var;
long long llong_var;
unsigned long long ullong_var;

void
convert_all(void)
{
        bool_var = bool_var;
        bool_var = char_var;
        bool_var = schar_var;
        bool_var = uchar_var;
        bool_var = short_var;
        bool_var = ushort_var;
        bool_var = int_var;
        bool_var = uint_var;
        bool_var = long_var;
        bool_var = ulong_var;
        bool_var = llong_var;
        bool_var = ullong_var;

        char_var = bool_var;
        char_var = char_var;
        char_var = schar_var;
        char_var = uchar_var;
        char_var = short_var;
        char_var = ushort_var;
        char_var = int_var;
        char_var = uint_var;
        /* expect+1: warning: conversion from 'long' to 'char' may lose accuracy [132] */
        char_var = long_var;
        /* expect+1: warning: conversion from 'unsigned long' to 'char' may lose accuracy [132] */
        char_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'char' may lose accuracy [132] */
        char_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'char' may lose accuracy [132] */
        char_var = ullong_var;

        schar_var = bool_var;
        schar_var = char_var;
        schar_var = schar_var;
        schar_var = uchar_var;
        schar_var = short_var;
        schar_var = ushort_var;
        schar_var = int_var;
        schar_var = uint_var;
        /* expect+1: warning: conversion from 'long' to 'signed char' may lose accuracy [132] */
        schar_var = long_var;
        /* expect+1: warning: conversion from 'unsigned long' to 'signed char' may lose accuracy [132] */
        schar_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
        schar_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
        schar_var = ullong_var;

        uchar_var = bool_var;
        uchar_var = char_var;
        uchar_var = schar_var;
        uchar_var = uchar_var;
        uchar_var = short_var;
        uchar_var = ushort_var;
        uchar_var = int_var;
        uchar_var = uint_var;
        /* expect+1: warning: conversion from 'long' to 'unsigned char' may lose accuracy [132] */
        uchar_var = long_var;
        /* expect+1: warning: conversion from 'unsigned long' to 'unsigned char' may lose accuracy [132] */
        uchar_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'unsigned char' may lose accuracy [132] */
        uchar_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
        uchar_var = ullong_var;

        short_var = bool_var;
        short_var = char_var;
        short_var = schar_var;
        short_var = uchar_var;
        short_var = short_var;
        short_var = ushort_var;
        short_var = int_var;
        short_var = uint_var;
        /* expect+1: warning: conversion from 'long' to 'short' may lose accuracy [132] */
        short_var = long_var;
        /* expect+1: warning: conversion from 'unsigned long' to 'short' may lose accuracy [132] */
        short_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'short' may lose accuracy [132] */
        short_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'short' may lose accuracy [132] */
        short_var = ullong_var;

        ushort_var = bool_var;
        ushort_var = char_var;
        ushort_var = schar_var;
        ushort_var = uchar_var;
        ushort_var = short_var;
        ushort_var = ushort_var;
        ushort_var = int_var;
        ushort_var = uint_var;
        /* expect+1: warning: conversion from 'long' to 'unsigned short' may lose accuracy [132] */
        ushort_var = long_var;
        /* expect+1: warning: conversion from 'unsigned long' to 'unsigned short' may lose accuracy [132] */
        ushort_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'unsigned short' may lose accuracy [132] */
        ushort_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned short' may lose accuracy [132] */
        ushort_var = ullong_var;

        int_var = bool_var;
        int_var = char_var;
        int_var = schar_var;
        int_var = uchar_var;
        int_var = short_var;
        int_var = ushort_var;
        int_var = int_var;
        int_var = uint_var;
        int_var = long_var;
        int_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
        int_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
        int_var = ullong_var;

        uint_var = bool_var;
        uint_var = char_var;
        uint_var = schar_var;
        uint_var = uchar_var;
        uint_var = short_var;
        uint_var = ushort_var;
        uint_var = int_var;
        uint_var = uint_var;
        uint_var = long_var;
        uint_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'unsigned int' may lose accuracy [132] */
        uint_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
        uint_var = ullong_var;

        long_var = bool_var;
        long_var = char_var;
        long_var = schar_var;
        long_var = uchar_var;
        long_var = short_var;
        long_var = ushort_var;
        long_var = int_var;
        long_var = uint_var;
        long_var = long_var;
        long_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'long' may lose accuracy [132] */
        long_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'long' may lose accuracy [132] */
        long_var = ullong_var;

        ulong_var = bool_var;
        ulong_var = char_var;
        ulong_var = schar_var;
        ulong_var = uchar_var;
        ulong_var = short_var;
        ulong_var = ushort_var;
        ulong_var = int_var;
        ulong_var = uint_var;
        ulong_var = long_var;
        ulong_var = ulong_var;
        /* expect+1: warning: conversion from 'long long' to 'unsigned long' may lose accuracy [132] */
        ulong_var = llong_var;
        /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned long' may lose accuracy [132] */
        ulong_var = ullong_var;

        llong_var = bool_var;
        llong_var = char_var;
        llong_var = schar_var;
        llong_var = uchar_var;
        llong_var = short_var;
        llong_var = ushort_var;
        llong_var = int_var;
        llong_var = uint_var;
        llong_var = long_var;
        llong_var = ulong_var;
        llong_var = llong_var;
        llong_var = ullong_var;

        ullong_var = bool_var;
        ullong_var = char_var;
        ullong_var = schar_var;
        ullong_var = uchar_var;
        ullong_var = short_var;
        ullong_var = ushort_var;
        ullong_var = int_var;
        ullong_var = uint_var;
        ullong_var = long_var;
        ullong_var = ulong_var;
        ullong_var = llong_var;
        ullong_var = ullong_var;
}