[Bug c/89734] New: const qualifier on return type not erased inside __typeof__
pascal_cuoq at hotmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Mar 15 23:52:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89734
Bug ID: 89734
Summary: const qualifier on return type not erased inside
__typeof__
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: pascal_cuoq at hotmail dot com
Target Milestone: ---
I think that this report is related to the implementation of a resolution from
DR 423 in 2017: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39985#c5
I would expect the following C program to be accepted:
#define CONST(x) __typeof__(const __typeof__(x))
#define POINTER(x) __typeof__(__typeof__(x) *)
#define ARRAY(x, n) __typeof__(__typeof__(x)[n])
#define FUNCTION(x, y) __typeof__(__typeof__(y)(__typeof__(x)))
extern int (* const p(int))[5];
FUNCTION(int, CONST(POINTER(ARRAY(int,5)))) p;
According to Compiler Explorer, it is accepted by Clang, and by GCC version up
to 6.3, but not by GCC version 7 and above, which complains:
error: conflicting types for 'p'
Compiler Explorer link: https://gcc.godbolt.org/z/c_9JTu
This may be related to how function types are handled inside __typeof__. If the
const attribute is not erased inside __typeof__, then it would not match the
type build for a plain declaration, where the const attribute is erased since
revision 236231.
If that were the case, then a solution would be to make the __typeof__
extension more uniform with the rest of the language.
More information about the Gcc-bugs
mailing list