www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 24022] New: ImportC: Error: attribute `__anonymous` is used

https://issues.dlang.org/show_bug.cgi?id=24022

          Issue ID: 24022
           Summary: ImportC: Error: attribute `__anonymous` is used as a
                    type
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: firemage.dima gmail.com

Hi,

This issue is related to Issue 23662.

Minimal example
===============

```c
// testlib.c
typedef enum {
    A = 1,
} E;
```

```d
// test.d
import testlib;

auto some_d_func(E v) {
    return v;
}

void main(string[] args) {
    E expected = A;
    auto res = some_d_func(A);
    assert (res == A);
    assert (res == expected);
}

```

This example produces following error:

```
dmd test.d testlib.c
test.d(3): Error: attribute `__anonymous` is used as a type
```

Other example
=============

```c
// testlib.c
typedef enum {
    A = 1,
} E;
```

```d
// test2.d
import testlib;

auto some_d_other_func() {
    const struct R {
        E r;

        this(in E vparam) {
            r = vparam;
        }
    }

    return R(A);
}

void main(string[] args) {
    E expected = A;
    auto res = some_d_other_func(A);
    assert (res.r == A);
    assert (res.r == expected);
}
```

This example produces following error:

```
dmd test2.d testlib.c
test2.d(5): Error: attribute `__anonymous` is used as a type
test2.d(7): Error: attribute `__anonymous` is used as a type
test2.d(16): Error: attribute `__anonymous` is used as a type
```


Real example with libpq
=======================

```c
//libpq.c
#include <postgresql/libpq-fe.h>
#include <postgresql/postgres_ext.h>
```

```d
// sample code from some d file.
 safe struct Result {
    // ...
    auto status() {
        const struct ResultStatus {
            ExecStatusType statusType;

            this(in ExecStatusType statusType) {
                this.statusType = statusType;
            }

            /// Return string representation of result status
            string toString() const {
                return PQresStatus(statusType).fromStringz.idup;
            }
        }

        return ResultStatus(PQresultStatus(_result._pg_result));
    }
}                      
// ....
```

--
Jun 28 2023