This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/63378] New: decltype and access control issues
- From: "roger.ferrer at bsc dot es" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 26 Sep 2014 07:28:29 +0000
- Subject: [Bug c++/63378] New: decltype and access control issues
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63378
Bug ID: 63378
Summary: decltype and access control issues
Product: gcc
Version: 4.9.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: roger.ferrer at bsc dot es
Hi,
the following testcase fails to compile with g++ 4.9.1 and 5.0.0 (20140925).
-- test.cc
template <typename T1, typename S1>
struct B { };
template <typename T1>
struct A
{
private:
template <typename T2, typename S2>
static B<T2, S2> bar();
public:
template <typename S2>
auto foo1() -> decltype(bar<T1, S2>());
};
// (*)
template<>
template<>
auto A<int>::foo1<float>() -> B<int, float>;
-- end of test.cc
$ g++ --version
g++ (GCC) 5.0.0 20140925 (experimental)
$ g++ -c -std=c++11 -c test.cc
test.cc:18:6: error: template-id âfoo1<float>â for âB<int, float>
A<int>::foo1()â does not match any template declaration
auto A<int>::foo1<float>() -> B<int, float>;
^
but making 'A<T1>::bar' public or using '-fno-access-control' g++ accepts the
code OK.
Explicitly using a manually substituted decltype gives a clue of what is going
on
-- test.cc
// Declarations of B and A above
// (*)
template<>
template<>
auto A<int>::foo1<float>() -> decltype(A<int>::bar<int, float>());
-- end of test.cc
$ g++ -c -std=c++11 -c test.cc
test.cc:22:6: error: template-id âfoo1<float>â for âB<int, float>
A<int>::foo1()â does not match any template declaration
auto A<int>::foo1<float>() -> decltype(A<int>::bar<int, float>());
^
test.cc:9:26: error: âstatic B<T2, S2> A<T1>::bar() [with T2 = int; S2 = float;
T1 = int]â is private
static B<T2, S2> bar();
^
test.cc:22:64: error: within this context
auto A<int>::foo1<float>() -> decltype(A<int>::bar<int, float>());
Both clang-3.5 and icc 14.0.2 accept this code.
Kind regards,