lock3 / meta

123 stars 11 forks source link

Friend injections are ignored #263

Open nilres opened 3 years ago

nilres commented 3 years ago

Hi,

if I inject a friend declearation into a class it is ignored / to present.

#include <iostream>

#include <experimental/compiler>
#include <experimental/meta>

namespace meta = std::experimental::meta;

class A;
void print_test(A a);

class A {
private:
    int test;

    consteval {
        -> fragment class {
            friend void print_test(A);
        };
    }
};

void print_test(A a) {
    std::cout<<a.test<<std::endl;
}

int main() {
    return 0;
}

results in

:23:18: error: 'test' is a private member of 'A'

std::cout<<a.test<<std::endl;

             ^

:13:9: note: declared private here

int test;

    ^

1 error generated.

https://cppx.godbolt.org/z/ve18qK

Any issues on my side? Is this even supported? Any clarification welcome. Thanks.

TimPhoeniX commented 3 years ago

I did a little experiment and managed to get it working https://cppx.godbolt.org/z/E1EE7s. It looks like forward declarations break it.

I also had trouble with friend declarations: https://cppx.godbolt.org/z/Ks9eqc. Possibly injected friend declarations are currently considered declaring separate entities from previously declared ones and you end up defining original declaration, that is not a friend.