Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
The C23 example as well as clang are correct. This is apparently a gcc bug in the latest 14.2 release, fixed in the "gcc (trunk)" unreleased version. The relevant part of the C23 standard here is ...
Answer
#2: Post edited
The C23 example as well as clang are correct. This is apparently a gcc bug in the latest 14.2 release, fixed in the "gcc (trunk)" unreleased version.- The relevant part of the C23 standard here is 6.7.4.1 §10:
- > If the specification of an array type includes any type qualifiers, both the array and the element type are so-qualified.
- (Also mentioned in 6.2.5 §31)
- In this case the element type is `const char* const`, where the first `const` belongs to the pointed-at type and the second `const` qualifies the pointer itself. Therefore because of the second `const`, the array item is `const` qualified. And therefore, according to the quoted part above, the whole array is `const` qualified too.
- Meaning that `typeof_unqual` should remove the `const` from the array type but not from the pointed-at item. This gives us a `const char* [3]`.
- The C23 example as well as clang are correct. This is apparently a gcc [bug](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112841) in the latest 14.2 release, fixed in the "gcc (trunk)" unreleased version.
- The relevant part of the C23 standard here is 6.7.4.1 §10:
- > If the specification of an array type includes any type qualifiers, both the array and the element type are so-qualified.
- (Also mentioned in 6.2.5 §31)
- In this case the element type is `const char* const`, where the first `const` belongs to the pointed-at type and the second `const` qualifies the pointer itself. Therefore because of the second `const`, the array item is `const` qualified. And therefore, according to the quoted part above, the whole array is `const` qualified too.
- Meaning that `typeof_unqual` should remove the `const` from the array type but not from the pointed-at item. This gives us a `const char* [3]`.
#1: Initial revision
The C23 example as well as clang are correct. This is apparently a gcc bug in the latest 14.2 release, fixed in the "gcc (trunk)" unreleased version. The relevant part of the C23 standard here is 6.7.4.1 §10: > If the specification of an array type includes any type qualifiers, both the array and the element type are so-qualified. (Also mentioned in 6.2.5 §31) In this case the element type is `const char* const`, where the first `const` belongs to the pointed-at type and the second `const` qualifies the pointer itself. Therefore because of the second `const`, the array item is `const` qualified. And therefore, according to the quoted part above, the whole array is `const` qualified too. Meaning that `typeof_unqual` should remove the `const` from the array type but not from the pointed-at item. This gives us a `const char* [3]`.