[cfe-dev] Template default arg : Friend function cannot access private member

suyog sarda sardask01 at gmail.com
Sun Sep 22 21:51:45 PDT 2013


Any Comment on this one?

On Thu, Sep 19, 2013 at 12:46 PM, suyog sarda <sardask01 at gmail.com> wrote:

> This is regarding a test case which involves default argument
> deduction/substitution. The test case can be summarized as :
>
>
> template <class T, class = typename T::I>h(T){}
>
> template <class T, class = typename T::I>j(T){}
>
> class A
> {
> typedef int I;
> friend void h<A>(A);
>
> };
>
> int main()
> {
> A a;
> h(a);
> j(a);
> }
>
> gcc-4.8.1 throws error for function j, since it has been not been declared
> friend nor it is private to class A and hence violates access rule for
>
> private member I(which is valid). gcc does not throw error for function h
> since it has been declared as friend to class A and hence can access
>
> private member I.
>
> Clang throws error for both the functions. Error for function j (not
> declared friend is valid and as expected), but it throws error even for
>
> friend function h (error : deduction of default arg failed since I is a
> private member of class A). This violates the accessibility of the friend
>
> function.
>
> The standard says - (At 14.8.2 pt 8)
>
>
> "If a substitution results in an invalid type or expression, type
> deduction fails. An in valid type or expression
>
> is one that would be ill-formed if written using the substituted
> arguments. [ Note: Access checking is done as
>
> part of the substitution process. —end note ]"
>
>
> Can someone please provide inputs as to how to check where the access
> rights are being checked in clang?  I am using QT creator to debug clang
>
> --
> With regards,
> Suyog
>



-- 
With regards,
Suyog Sarda
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130923/d20a3c65/attachment.html>


More information about the cfe-dev mailing list