public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/110798] New: The reusult of sizeof operator followed with an 'unsigned typedef-ed generic integer' type is alway 4 bytes(except char)
@ 2023-07-25  6:49 13958014620 at 139 dot com
  2023-07-25  6:59 ` [Bug c++/110798] [12/13 Regression] " pinskia at gcc dot gnu.org
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: 13958014620 at 139 dot com @ 2023-07-25  6:49 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110798

            Bug ID: 110798
           Summary: The reusult of sizeof operator followed with an
                    'unsigned typedef-ed generic integer' type is alway 4
                    bytes(except char)
           Product: gcc
           Version: og12 (devel/omp/gcc-12)
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: 13958014620 at 139 dot com
  Target Milestone: ---

Some issues arised when doing some tests.
The reusult of sizeof operator followed with an 'unsigned typedef-ed generic
integer' type is always 4 bytes(except char).

The following example had run in fedora 37 OS with gcc_12.3.1 and
gcc_13.1.0(compiled myself), both versions of gcc show the same issue.


#include <cassert>
int main(int argc, char ** argv){
        int ret=0;

    typedef char ch_t;
        assert( sizeof(unsigned char) == 1); //right
        assert( sizeof(ch_t) == 1 ); //right
        assert( sizeof(unsigned ch_t) == 1); //the only one right

    typedef signed char sch;
        assert( sizeof(unsigned char) == 1); //right
        assert( sizeof(sch) == 1 ); //right
        assert( sizeof(unsigned sch) == 4); //wrong, which should be 1

    typedef short sint;
        assert( sizeof(unsigned short) == 2 ); //right
        assert( sizeof(sint) == 2 ); //right
        assert( sizeof(unsigned sint) == 4); //wrong, which should be 8

    typedef long lint;
        assert( sizeof(unsigned long) == 8); //right
        assert( sizeof(lint) == 8 ); //right
        assert( sizeof(unsigned lint) == 4); //wrong, which should be 8

    typedef long long llint;
        assert( sizeof(unsigned long long) == 8); //right
        assert( sizeof(llint) == 8 ); //right
        assert( sizeof(unsigned llint) ==4); //wrong, which should be 8

    /* The same errors as: 
       'typedef signed short ssint', 
       'typedef signed long slint', 
       'typedef signed long long sllint', 
       'typedef unsigned short usint', 
       'typedef unsigned long ulint', 
       'typedef unsigned long long ullint', 
        so that seems all sizeof(unsigned <typedef-ed char/short/int/long
type>) == 4, 
        except typedef char ch_t;
    */
        return ret;
}
----------- or a version outputting the result on the terminal --------------

#include <iostream>
#include <cassert>
using namespace std;
int main(int argc, char ** argv){
    int ret=0;

    typedef char ch_t;
    cout << "typedef char ch_t;"<<endl;
        assert( sizeof(unsigned char) == 1); //right
        cout << "\tsizeof(unsigned char)=" << sizeof(unsigned char) <<endl;
        assert( sizeof(ch_t) == 1 ); //right
        cout << "\tsizeof(ch_t)=" << sizeof(ch_t) <<endl;
        assert( sizeof(unsigned ch_t) == 1); //the only one right
        cout << "\tsizeof(unsigned ch_t)=" << sizeof(unsigned ch_t)  << " --
the only one right"<<endl;

    typedef signed char sch;
    cout << endl << "typedef signed char sch;"<<endl;
        assert( sizeof(unsigned char) == 1); //right
        cout << "\tsizeof(unsigned char)=" << sizeof(unsigned char) <<endl;
        assert( sizeof(sch) == 1 ); //right
        cout << "\tsizeof(sch)=" << sizeof(sch) <<endl;
        assert( sizeof(unsigned sch) == 4); //wrong, which should be 1
        cout << "\tsizeof(unsigned sch)=" << sizeof(unsigned sch)  << " --
wrong"<<endl;

    typedef short sint;
    cout << endl << "typedef short sint;" <<endl;
        assert( sizeof(unsigned short) == 2 ); //right
        cout << "\tsizeof(unsigned short)=" << sizeof(unsigned short int)
<<endl;
        assert( sizeof(sint) == 2 ); //right
        cout << "\tsizeof(sint)=" << sizeof(sint) <<endl;
        assert( sizeof(unsigned sint) == 4); //wrong, which should be 8
        cout << "\tsizeof(unsigned sint)=" << sizeof(unsigned sint)  << " --
wrong"<<endl;

    typedef long lint;
    cout << endl << "typedef long lint;" <<endl;
        assert( sizeof(unsigned long) == 8); //right
        cout << "\tsizeof(unsigned long)=" << sizeof(unsigned long int) <<endl;
        assert( sizeof(lint) == 8 ); //right
        cout << "\tsizeof(lint)=" << sizeof(lint) <<endl;
        assert( sizeof(unsigned lint) == 4); //wrong, which should be 8
        cout << "\tsizeof(unsigned lint)=" << sizeof(unsigned lint)  << " --
wrong"<<endl;

    typedef long long llint;
    cout << endl << "typedef long long llint;" <<endl; 
        assert( sizeof(unsigned long long) == 8); //right
        cout << "\tsizeof(unsigned long long)=" << sizeof(unsigned long long
int) <<endl;

        assert( sizeof(llint) == 8 ); //right
        cout << "\tsizeof(llint)=" << sizeof(llint) <<endl;

        assert( sizeof(unsigned llint) ==4); //wrong, which should be 8
        cout << "\tsizeof(unsigned llint)=" << sizeof(unsigned llint) << " --
wrong"<<endl;

    cout << endl << "The same errors as: \n\
       'typedef signed short ssint', \n\
       'typedef signed long slint', \n\
       'typedef signed long long sllint', \n\
       'typedef unsigned short usint', \n\
       'typedef unsigned long ulint', \n\
       'typedef unsigned long long ullint', \n\
so that seems all sizeof(unsigned <typedef-ed char/short/int/long type>) == 4,
\n\
except typedef char ch_t;" << endl;
        return ret;
}

These issues can't reproduce in pure C language with GCC 12 and 13.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-07-26  5:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-25  6:49 [Bug c++/110798] New: The reusult of sizeof operator followed with an 'unsigned typedef-ed generic integer' type is alway 4 bytes(except char) 13958014620 at 139 dot com
2023-07-25  6:59 ` [Bug c++/110798] [12/13 Regression] " pinskia at gcc dot gnu.org
2023-07-25  7:02 ` [Bug c++/110798] [12 " pinskia at gcc dot gnu.org
2023-07-25  7:14 ` 13958014620 at 139 dot com
2023-07-25  9:59 ` rguenth at gcc dot gnu.org
2023-07-25 10:39 ` redi at gcc dot gnu.org
2023-07-25 10:50 ` redi at gcc dot gnu.org
2023-07-26  5:11 ` 13958014620 at 139 dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).