Issue 120357
Summary Old alignof Macro for C89 Broken as C23 Extension
Labels new issue
Assignees
Reporter Sha0
    Please consider the following **offsetof.c** file:

```
~ $ cat offsetof.c 
/*
 * Compiler:

~ $ gcc -v
clang version 19.1.4
Target: aarch64-unknown-linux-android24
Thread model: posix
InstalledDir: /data/data/com.termux/files/usr/bin

 * Error:

 ~ $ gcc -ansi -pedantic -Wall -Wextra -Werror -o offsetof offsetof.c 2>&1
offsetof.c:27:21: error: defining a type within 'offsetof' is a C23 extension [-Werror,-Wc23-extensions]
   27 |     return offsetof(struct { char c; }, c);
      | ^~~~~~
/data/data/com.termux/files/usr/lib/clang/19/include/__stddef_offsetof.h:16:43: note: expanded from macro 'offsetof'
   16 | #define offsetof(t, d) __builtin_offsetof(t, d)
      | ^
1 error generated.

 * Why?
 */
#include <stddef.h>

int main(void)
  {
    return offsetof(struct { char c; }, c);
  }
```

A relevant portion of C89 for **stddef.h** is:

```
[...] and

 offsetof( type,  member-designator)

which expands to an integral constant _expression_ that has type size_t,
the value of which is the offset in bytes, to the structure member
(designated by member-designator ), from the beginning of its
structure (designated by type ). The member-designator shall be such
that given

         static  type t;

then the _expression_ &(t.  member-designator ) evaluates to an address
constant.  (If the specified member is a bit-field, the behavior is
undefined.)
[...]
```

The **clang** error-message reports a "C23 extension."  It is now December, 2024.  At least 12 years ago, this "code-snippet" was produced:
- https://ideone.com/wL6wm
- (linked to from the https://www.iso-9899.info/wiki/Code_snippets page)

It uses an **alignof** macro shared by Mr. Chris M. Thomasson in **Usenet** (probably the **comp.lang.c** section) from before that time, which is something like:
```
#define alignof(type) (offsetof(struct {char c; type t;}, t))
```

I suspect that similar macros have been in use for much, much longer, but I could be mistaken.

If we are invoking clang in a C89 mode and we interpret the quotation above as authoritative, then I perceive that the type used within the offsetof macro in the code-file (shared far above) meets the "static type t;" condition and I do not perceive a C23 extension being relevant to such old usage.

Is this an opportunity for improvement?
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to