[Issue 24641] New: ImportC: enum typedef before definition is not supported
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Sun Jun 30 08:29:14 UTC 2024
    
    
  
https://issues.dlang.org/show_bug.cgi?id=24641
          Issue ID: 24641
           Summary: ImportC: enum typedef before definition is not
                    supported
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: andrej.mitrovich at gmail.com
This is a small snippet from a C++ library blend2d that can be used in C.
Here's the header file lib.h:
---
#ifdef __cplusplus
  #define BL_DEFINE_CONST static constexpr
  #define BL_DEFINE_ENUM(NAME) enum NAME : uint32_t
  #define BL_FORCE_ENUM_UINT32(ENUM_VALUE_PREFIX)
#else
  #define BL_DEFINE_CONST static const
  #define BL_DEFINE_ENUM(NAME) typedef enum NAME NAME; enum NAME
  #define BL_FORCE_ENUM_UINT32(ENUM_VALUE_PREFIX)
,ENUM_VALUE_PREFIX##_FORCE_UINT = 0xFFFFFFFFu
#endif
BL_DEFINE_ENUM(BLObjectType) {
  BL_OBJECT_TYPE_RGBA = 0,
  BL_OBJECT_TYPE_RGBA32 = 1,
};
int blArrayInit(BLObjectType arrayType);
---
Running the VC preprocessor:
---
cl /P /TC /EP /Filib.c lib.h
---
Generates this code:
---
typedef enum BLObjectType BLObjectType; enum BLObjectType {
  BL_OBJECT_TYPE_RGBA = 0,
  BL_OBJECT_TYPE_RGBA32 = 1,
};
int blArrayInit(BLObjectType arrayType);
---
This cannot be imported with DMD:
---
$ dmd -o- lib.c
lib.c(5): Error: cannot have parameter of opaque type `BLObjectType` by value
---
Moving the type def /after/ the enum definition fixes this as expected.
But it looks like existing C compilers (other than DMD's) seem to support this
syntax.
Both VC and GCC work with these typedefs. I'm not sure what they do underneath
the hood to make this work.
--
    
    
More information about the Digitalmars-d-bugs
mailing list