Opened 2 years ago

Closed 2 months ago

#269 closed defect (fixed)

Wrong type for generics' implicit _sizeof params on 32-bit

Reported by: mlbrooks Owned by:
Priority: major Component: cfa-cc
Version: 1.0 Keywords:
Cc:

Description (last modified by mlbrooks)

Current form of the issue, remaining after partial fix in 58eb9250e:

forall( T * )
void mary( const T & ) {
	printf( "%zu\n", sizeof(T) );  // used to fail, because sizeof(-) always had type long unsigned int
	for ( i; sizeof(T) ) {
		if (i > 0) printf(" ");
		printf( "%zu", i);         // still failing, because i is always getting type long unsigned int, even when sizeof(-) is getting type size_t
	}
	printf("\n");
}

int main() {
	float x = 3.14;
	mary(x);
	return 0;
}

Compiling as:

cfa -Wall -Werror -m32 test.cfa

Actual: compilation error: format ‘%zu’ expects argument of type ‘size_t’, but argument 2 has type ‘long unsigned int’ at comment "still failing"

Expected: Run with output

4
0 1 2 3

Original form of the issue, fixed by 58eb9250e:

forall(T)
void fred( T x ) {
    printf( "%zu\n", sizeof(T) );
    printf( "%zu\n", sizeof(x) );
}
int main() {
    char c = 'x';
    fred(c);
}

Compiling as

cfa -Wall -Werror x.cfa

Expected, actual on plg2: runs and prints 1 twice.

Actual on ruby: compilation error (twice): format ‘%zu’ expects argument of type ‘size_t’, but argument 2 has type ‘long unsigned int’

(Found by Peter, whittled by Mike.)

Change History (2)

comment:1 Changed 3 months ago by mlbrooks

Description: modified (diff)

Revise, given partial fix

comment:2 Changed 2 months ago by mlbrooks

Resolution: fixed
Status: newclosed

Fixed in [d3d54b3f6].

Note: See TracTickets for help on using tickets.