# New Ticket Created by  Curt Tilmes 
# Please include the string:  [perl #131311]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=131311 >


If I have embedded (with 'HAS', not referenced with 'has') CStruct or
CUnions, and set
the first field in the embedded struct to a 0 (looks like a NULL pointer?)
I get an incorrect error message about the struct being a 'type object'
(undefined)

Perhaps easiest to demonstrate with an example:

$ cat foo.h
#include <inttypes.h>

typedef struct foo {
    struct {
        uint64_t a;
    } data;
} foo_t;

extern void fill_foo(foo_t *f, uint64_t a);
$ cat foo.c
#include "foo.h"

void fill_foo(foo_t *f, uint64_t a)
{
    f->data.a = a;
}
$ gcc -c -Wall -Werror -fpic foo.c
$ gcc -shared -o libfoo.so foo.o
$ perl6 -v
This is Rakudo version 2017.04.3-47-gf0414c4 built on MoarVM version
2017.04-44-gf0db882
implementing Perl 6.c.
$ cat fooperl.pl
use v6;

use NativeCall;

class data is repr('CStruct') {
    has uint64 $.a;
}

class foo is repr('CStruct') {
    HAS data $.data;
}

sub fill_foo(foo, uint64) is native('foo') {*}

my $foo = foo.new;

fill_foo($foo, 27);

say $foo.data.a;   # Works fine, data looks 'defined'

fill_foo($foo, 0);

say $foo.data.a;   # Error, data looks 'undefined'?
$ perl6 fooperl.pl
27
Cannot look up attributes in a data type object
  in block <unit> at fooperl.pl line 23

Reply via email to