* sizeof
@ 2022-05-08 15:22 Russell Shaw
2022-05-08 17:29 ` sizeof Simon Marchi
0 siblings, 1 reply; 15+ messages in thread
From: Russell Shaw @ 2022-05-08 15:22 UTC (permalink / raw)
To: GDB mailing list
When inspecting a C++ file, i get:
(gdb) p sizeof(int())
$82 = 1
(gdb) p sizeof(int)
$83 = 4
Not right ?
Package: gdb
Version: 11.2-1
on debian
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-08 15:22 sizeof Russell Shaw
@ 2022-05-08 17:29 ` Simon Marchi
2022-05-08 17:48 ` sizeof Andreas Schwab
2022-05-09 7:21 ` sizeof Russell Shaw
0 siblings, 2 replies; 15+ messages in thread
From: Simon Marchi @ 2022-05-08 17:29 UTC (permalink / raw)
To: Russell Shaw, GDB mailing list
On 2022-05-08 11:22, Russell Shaw wrote:
> When inspecting a C++ file, i get:
>
> (gdb) p sizeof(int())
> $82 = 1
>
> (gdb) p sizeof(int)
> $83 = 4
>
> Not right ?
>
> Package: gdb
> Version: 11.2-1
> on debian
The compiler seems to agree with GDB:
$ cat test.cpp
#include <stdio.h>
int main()
{
printf("%zu\n", sizeof(int));
printf("%zu\n", sizeof(int()));
}
$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:6:19: warning: invalid application of ‘sizeof’ to a function type [-Wpointer-arith]
6 | printf("%zu\n", sizeof(int()));
| ^~~~~~~~~~~~~
$ ./a.out
4
1
I don't really know what sizeof(int()) means anyway. clang just rejects
it:
$ clang++ test.cpp
test.cpp:6:19: error: invalid application of 'sizeof' to a function type
printf("%zu\n", sizeof(int()));
^ ~~~~~~~
Simon
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-08 17:29 ` sizeof Simon Marchi
@ 2022-05-08 17:48 ` Andreas Schwab
2022-05-09 7:21 ` sizeof Russell Shaw
1 sibling, 0 replies; 15+ messages in thread
From: Andreas Schwab @ 2022-05-08 17:48 UTC (permalink / raw)
To: Simon Marchi via Gdb; +Cc: Russell Shaw, Simon Marchi
On Mai 08 2022, Simon Marchi via Gdb wrote:
> I don't really know what sizeof(int()) means anyway.
It's a GNU extension, much like sizeof(void), so that you can subtract
function pointers.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-08 17:29 ` sizeof Simon Marchi
2022-05-08 17:48 ` sizeof Andreas Schwab
@ 2022-05-09 7:21 ` Russell Shaw
2022-05-09 7:35 ` sizeof Andreas Schwab
2022-05-10 3:46 ` sizeof Russell Shaw
1 sibling, 2 replies; 15+ messages in thread
From: Russell Shaw @ 2022-05-09 7:21 UTC (permalink / raw)
To: GDB mailing list
On 9/5/22 3:29 am, Simon Marchi wrote:
>
>
> On 2022-05-08 11:22, Russell Shaw wrote:
>> When inspecting a C++ file, i get:
>>
>> (gdb) p sizeof(int())
>> $82 = 1
>>
>> (gdb) p sizeof(int)
>> $83 = 4
>>
>> Not right ?
>>
>> Package: gdb
>> Version: 11.2-1
>> on debian
>
> The compiler seems to agree with GDB:
>
> $ cat test.cpp
> #include <stdio.h>
>
> int main()
> {
> printf("%zu\n", sizeof(int));
> printf("%zu\n", sizeof(int()));
> }
> $ g++ test.cpp
> test.cpp: In function ‘int main()’:
> test.cpp:6:19: warning: invalid application of ‘sizeof’ to a function type [-Wpointer-arith]
> 6 | printf("%zu\n", sizeof(int()));
> | ^~~~~~~~~~~~~
> $ ./a.out
> 4
> 1
>
> I don't really know what sizeof(int()) means anyway. clang just rejects
> it:
>
> $ clang++ test.cpp
> test.cpp:6:19: error: invalid application of 'sizeof' to a function type
> printf("%zu\n", sizeof(int()));
> ^ ~~~~~~~
sizeof(int()) should transform to sizeof(int (*)()) according to the
C++20 standard.
**********************************************************************
cat main.cpp
void f(int()) { }
int a = f;
int main() { }
g++ -DHAVE_CONFIG_H -I. -std=c++20 -Wall -Wno-unused -g -O0 -MT
main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
main.cpp:8:9: error: invalid conversion from ‘void (*)(int (*)())’ to
‘int’ [-fpermissive]
8 | int a = f;
| ^
| |
| void (*)(int (*)())
**********************************************************************
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-09 7:21 ` sizeof Russell Shaw
@ 2022-05-09 7:35 ` Andreas Schwab
2022-05-10 3:46 ` sizeof Russell Shaw
1 sibling, 0 replies; 15+ messages in thread
From: Andreas Schwab @ 2022-05-09 7:35 UTC (permalink / raw)
To: Russell Shaw; +Cc: GDB mailing list
On Mai 09 2022, Russell Shaw wrote:
> sizeof(int()) should transform to sizeof(int (*)()) according to the C++20
> standard.
No, see [expr.sizeof] #3.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-09 7:21 ` sizeof Russell Shaw
2022-05-09 7:35 ` sizeof Andreas Schwab
@ 2022-05-10 3:46 ` Russell Shaw
2022-05-10 7:22 ` sizeof Andreas Schwab
1 sibling, 1 reply; 15+ messages in thread
From: Russell Shaw @ 2022-05-10 3:46 UTC (permalink / raw)
To: gdb
>Andreas Schwab wrote:
>On Mai 09 2022, Russell Shaw wrote:
>
>> sizeof(int()) should transform to sizeof(int (*)()) according to the C++20
>> standard.
>
>No, see [expr.sizeof] #3.
What does "[expr.sizeof] #3" refer to ?
unary-expression :
...
sizeof ( type-id )
type-id :
type-specifier-seq abstract-declarator(opt)
No expressions here.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-10 3:46 ` sizeof Russell Shaw
@ 2022-05-10 7:22 ` Andreas Schwab
2022-05-10 14:20 ` sizeof Russell Shaw
0 siblings, 1 reply; 15+ messages in thread
From: Andreas Schwab @ 2022-05-10 7:22 UTC (permalink / raw)
To: Russell Shaw; +Cc: gdb
On Mai 10 2022, Russell Shaw wrote:
>>Andreas Schwab wrote:
>>On Mai 09 2022, Russell Shaw wrote:
>>
>>> sizeof(int()) should transform to sizeof(int (*)()) according to the C++20
>>> standard.
>>
>>No, see [expr.sizeof] #3.
>
> What does "[expr.sizeof] #3" refer to ?
Paragrph #3 in section [expr.sizeof].
"The lvalue-to-rvalue (7.3.1), array-to-pointer (7.3.2), and
function-to-pointer (7.3.3) standard conversions are not applied to
the operand of sizeof."
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-10 7:22 ` sizeof Andreas Schwab
@ 2022-05-10 14:20 ` Russell Shaw
2022-05-10 14:48 ` sizeof Andreas Schwab
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Russell Shaw @ 2022-05-10 14:20 UTC (permalink / raw)
To: Andreas Schwab; +Cc: gdb
On 10/5/22 5:22 pm, Andreas Schwab wrote:
> On Mai 10 2022, Russell Shaw wrote:
>
>>> Andreas Schwab wrote:
>>> On Mai 09 2022, Russell Shaw wrote:
>>>
>>>> sizeof(int()) should transform to sizeof(int (*)()) according to the C++20
>>>> standard.
>>>
>>> No, see [expr.sizeof] #3.
>>
>> What does "[expr.sizeof] #3" refer to ?
>
> Paragrph #3 in section [expr.sizeof].
>
> "The lvalue-to-rvalue (7.3.1), array-to-pointer (7.3.2), and
> function-to-pointer (7.3.3) standard conversions are not applied to
> the operand of sizeof."
"Standard conversions" are only applied to expressions, not type-id (which is an
abstract declarator syntax).
7.6.2.5 Sizeof [expr.sizeof]
3) only applies to the first case "sizeof unary-expression", not the second
"sizeof ( type-id )".
unary-expression :
...
sizeof unary-expression
sizeof ( type-id )
**************
7.6.2.5 Sizeof [expr.sizeof]
3)
The lvalue-to-rvalue (7.3.2), array-to-pointer (7.3.3), and
function-to-pointer (7.3.4) standard conversions are not applied to the operand
of sizeof. If the operand is a prvalue, the temporary materialization conversion
(7.3.5) is applied.
**************
7.3 Standard conversions [conv]
7.3.1 General [conv.general]
A standard conversion sequence will be applied to an expression if necessary to
convert it to a required destination type.
**************
I don't seem to get all replies on the gdb list so i'm including your email in
case you don't get all replies either. I have to check the gdb web page archive.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-10 14:20 ` sizeof Russell Shaw
@ 2022-05-10 14:48 ` Andreas Schwab
2022-05-10 15:43 ` sizeof Russell Shaw
2022-05-10 15:48 ` sizeof Russell Shaw
2 siblings, 0 replies; 15+ messages in thread
From: Andreas Schwab @ 2022-05-10 14:48 UTC (permalink / raw)
To: Russell Shaw; +Cc: gdb
On Mai 11 2022, Russell Shaw wrote:
> On 10/5/22 5:22 pm, Andreas Schwab wrote:
>> On Mai 10 2022, Russell Shaw wrote:
>>
>>>> Andreas Schwab wrote:
>>>> On Mai 09 2022, Russell Shaw wrote:
>>>>
>>>>> sizeof(int()) should transform to sizeof(int (*)()) according to the C++20
>>>>> standard.
>>>>
>>>> No, see [expr.sizeof] #3.
>>>
>>> What does "[expr.sizeof] #3" refer to ?
>> Paragrph #3 in section [expr.sizeof].
>> "The lvalue-to-rvalue (7.3.1), array-to-pointer (7.3.2), and
>> function-to-pointer (7.3.3) standard conversions are not applied to
>> the operand of sizeof."
>
> "Standard conversions" are only applied to expressions, not type-id (which
> is an abstract declarator syntax).
So what's the chapter and verse for your claim?
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-10 14:20 ` sizeof Russell Shaw
2022-05-10 14:48 ` sizeof Andreas Schwab
@ 2022-05-10 15:43 ` Russell Shaw
2022-05-10 15:48 ` sizeof Russell Shaw
2 siblings, 0 replies; 15+ messages in thread
From: Russell Shaw @ 2022-05-10 15:43 UTC (permalink / raw)
To: gdb, Andreas Schwab
Andreas Schwab wrote:
>On Mai 11 2022, Russell Shaw wrote:
>
>> On 10/5/22 5:22 pm, Andreas Schwab wrote:
>>> On Mai 10 2022, Russell Shaw wrote:
>>>
>>>>> Andreas Schwab wrote:
>>>>> On Mai 09 2022, Russell Shaw wrote:
>>>>>
>>>>>> sizeof(int()) should transform to sizeof(int (*)()) according to the
C++20 standard.
>>>>>
>>>>> No, see [expr.sizeof] #3.
>>>>
>>>> What does "[expr.sizeof] #3" refer to ?
>>> Paragrph #3 in section [expr.sizeof].
>>> "The lvalue-to-rvalue (7.3.1), array-to-pointer (7.3.2), and
>>> function-to-pointer (7.3.3) standard conversions are not applied to
>>> the operand of sizeof."
>>
>> "Standard conversions" are only applied to expressions, not type-id (which
>> is an abstract declarator syntax).
>
>So what's the chapter and verse for your claim?
It is not spelt out, but implied from the context.
Clearly, the standard conversions are only a meaningful concept for expressions.
"int()" is not an expression, but a type-id
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-10 14:20 ` sizeof Russell Shaw
2022-05-10 14:48 ` sizeof Andreas Schwab
2022-05-10 15:43 ` sizeof Russell Shaw
@ 2022-05-10 15:48 ` Russell Shaw
2022-05-10 16:06 ` sizeof Andreas Schwab
2022-05-11 5:38 ` sizeof Russell Shaw
2 siblings, 2 replies; 15+ messages in thread
From: Russell Shaw @ 2022-05-10 15:48 UTC (permalink / raw)
To: gdb, Andreas Schwab
Andreas Schwab wrote:
>On Mai 11 2022, Russell Shaw wrote:
>
>> On 10/5/22 5:22 pm, Andreas Schwab wrote:
>>> On Mai 10 2022, Russell Shaw wrote:
>>>
>>>>> Andreas Schwab wrote:
>>>>> On Mai 09 2022, Russell Shaw wrote:
>>>>>
>>>>>> sizeof(int()) should transform to sizeof(int (*)()) according to the
C++20 standard.
>>>>>
>>>>> No, see [expr.sizeof] #3.
>>>>
>>>> What does "[expr.sizeof] #3" refer to ?
>>> Paragrph #3 in section [expr.sizeof].
>>> "The lvalue-to-rvalue (7.3.1), array-to-pointer (7.3.2), and
>>> function-to-pointer (7.3.3) standard conversions are not applied to
>>> the operand of sizeof."
>>
>> "Standard conversions" are only applied to expressions, not type-id (which
>> is an abstract declarator syntax).
>
>So what's the chapter and verse for your claim?
It is not spelt out, but implied from the context.
Clearly, the standard conversions are only a meaningful concept for expressions.
"int()" is not an expression, but a type-id for a function pointer "int(*)()"
so "sizeof(int())" == "size of ptr to function"
unary-expression :
...
sizeof unary-expression
sizeof ( type-id )
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-10 15:48 ` sizeof Russell Shaw
@ 2022-05-10 16:06 ` Andreas Schwab
2022-05-11 5:38 ` sizeof Russell Shaw
1 sibling, 0 replies; 15+ messages in thread
From: Andreas Schwab @ 2022-05-10 16:06 UTC (permalink / raw)
To: Russell Shaw; +Cc: gdb
On Mai 11 2022, Russell Shaw wrote:
> "int()" is not an expression, but a type-id for a function pointer "int(*)()"
Where does it say that?
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-10 15:48 ` sizeof Russell Shaw
2022-05-10 16:06 ` sizeof Andreas Schwab
@ 2022-05-11 5:38 ` Russell Shaw
2022-05-11 8:16 ` sizeof Russell Shaw
1 sibling, 1 reply; 15+ messages in thread
From: Russell Shaw @ 2022-05-11 5:38 UTC (permalink / raw)
To: gdb, Andreas Schwab
Andreas Schwab wrote:
>On Mai 11 2022, Russell Shaw wrote:
>
>> "int()" is not an expression, but a type-id for a function pointer "int(*)()"
>
>Where does it say that?
*****************
7.2 Properties of expressions
7.2.1 Value category
2) Every expression belongs to exactly one of the fundamental classifications in
this taxonomy: lvalue, xvalue, or prvalue. This property of an expression is
called its value category.
*****************
Does "int()" look like a lvalue, xvalue, or prvalue ?
*****************
9.3.3 Ambiguity resolution [dcl.ambig.res]
1)
...
Just as for the ambiguities mentioned in 8.9, the resolution is to consider any
construct that matches the syntax of a declaration to be a declaration.
*****************
Note that a type-id is a declaration syntax.
The parameter "int()" of "void f(int())" is a type-id because:
template-parameter :
type-parameter
type-parameter :
type-parameter-key identifier(opt) = type-id
Therefore, decaying "int()" to "int(*)()" is not performed on an expression, so
none of the prohibitions about standard conversions (an expression concept) applies.
*****************
9.3.3 Ambiguity resolution [dcl.ambig.res]
2)
...
void foo(signed char a)
{
sizeof(int()); // type-id (ill-formed)
...
}
*****************
The standard has an error because "int()" is a valid type-id
void f(int());
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-11 5:38 ` sizeof Russell Shaw
@ 2022-05-11 8:16 ` Russell Shaw
2022-05-11 17:44 ` sizeof Russell Shaw
0 siblings, 1 reply; 15+ messages in thread
From: Russell Shaw @ 2022-05-11 8:16 UTC (permalink / raw)
To: gdb, Andreas Schwab
int bar() {
return 0;
}
template<class T = int()> void foo()
{
T p = bar;
}
int
main(int argc, char *argv[])
{
foo();
}
g++ ...
main.cpp: In instantiation of ‘void foo() [with T = int()]’:
main.cpp:13:9: required from here
main.cpp:7:7: error: variable ‘p’ has function type
7 | T p = bar;
| ^
***************************************************
If the "int()" type-id decayed to "int(*)()", this would work.
"sizeof(int()) => 1" just seems wrong, but maybe it's a matter of taste that has
been explicitly decided.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: sizeof
2022-05-11 8:16 ` sizeof Russell Shaw
@ 2022-05-11 17:44 ` Russell Shaw
0 siblings, 0 replies; 15+ messages in thread
From: Russell Shaw @ 2022-05-11 17:44 UTC (permalink / raw)
To: gdb, Andreas Schwab
On 11/5/22 18:16, Russell Shaw wrote:
...
> "sizeof(int()) => 1" just seems wrong, but maybe it's a matter of taste that has
> been explicitly decided.
Despite all the proceeding, i don't think "sizeof(int())" should be sizeof ptr
to function now. The objective of sizeof is for finding the size an item will be
in an array of the items.
sizeof(int[3]); => 12
sizeof(int()); => illegal
"int()" is a legal type-id for a function, but you can't have an array of
functions. "int()" could be decayed to a ptr "int(*)()", but that would be
inconsistant with "int[3]" that you wouldn't want to decay.
So i conclude that g++ is right by saying "warning: invalid application of
‘sizeof’ to a function type", and gdb should not say "sizeof(int())" => 1
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2022-05-11 17:44 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-08 15:22 sizeof Russell Shaw
2022-05-08 17:29 ` sizeof Simon Marchi
2022-05-08 17:48 ` sizeof Andreas Schwab
2022-05-09 7:21 ` sizeof Russell Shaw
2022-05-09 7:35 ` sizeof Andreas Schwab
2022-05-10 3:46 ` sizeof Russell Shaw
2022-05-10 7:22 ` sizeof Andreas Schwab
2022-05-10 14:20 ` sizeof Russell Shaw
2022-05-10 14:48 ` sizeof Andreas Schwab
2022-05-10 15:43 ` sizeof Russell Shaw
2022-05-10 15:48 ` sizeof Russell Shaw
2022-05-10 16:06 ` sizeof Andreas Schwab
2022-05-11 5:38 ` sizeof Russell Shaw
2022-05-11 8:16 ` sizeof Russell Shaw
2022-05-11 17:44 ` sizeof Russell Shaw
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).