re PR c++/56749 (weird interaction between scoped enum used as non-type template parameter and template lookup)
PR c++/56749 * semantics.c (finish_qualified_id_expr): Return early for enum scope. From-SVN: r197166
This commit is contained in:
parent
f49b33cb22
commit
d348f17260
@ -1,3 +1,9 @@
|
||||
2013-03-27 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/56749
|
||||
* semantics.c (finish_qualified_id_expr): Return early
|
||||
for enum scope.
|
||||
|
||||
2013-03-26 Gabriel Dos Reis <gdr@integrable-solutions.net>
|
||||
|
||||
* call.c (build_new_method_call_1): Use INDIRECT_REF_P.
|
||||
|
@ -1762,6 +1762,10 @@ finish_qualified_id_expr (tree qualifying_class,
|
||||
return expr;
|
||||
}
|
||||
|
||||
/* No need to check access within an enum. */
|
||||
if (TREE_CODE (qualifying_class) == ENUMERAL_TYPE)
|
||||
return expr;
|
||||
|
||||
/* Within the scope of a class, turn references to non-static
|
||||
members into expression of the form "this->...". */
|
||||
if (template_arg_p)
|
||||
|
57
gcc/testsuite/g++.dg/cpp0x/enum24.C
Normal file
57
gcc/testsuite/g++.dg/cpp0x/enum24.C
Normal file
@ -0,0 +1,57 @@
|
||||
// PR c++/56749
|
||||
// { dg-require-effective-target c++11 }
|
||||
|
||||
enum normal_enum
|
||||
{
|
||||
not_scoped1,
|
||||
not_scoped2
|
||||
};
|
||||
|
||||
enum class scoped_enum
|
||||
{
|
||||
scoped1,
|
||||
scoped2
|
||||
};
|
||||
|
||||
template <normal_enum N=not_scoped1>
|
||||
class A
|
||||
{
|
||||
public:
|
||||
template <typename T>
|
||||
void fun ()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
template <scoped_enum N=scoped_enum::scoped1>
|
||||
class B
|
||||
{
|
||||
public:
|
||||
template <typename T>
|
||||
void fun ()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename T>
|
||||
void tfun ()
|
||||
{
|
||||
A<> a;
|
||||
a.fun<char>(); //<------------ THIS IS FINE
|
||||
|
||||
B<> b_defaulted;
|
||||
B<scoped_enum::scoped1> b_explicited;
|
||||
|
||||
b_defaulted.fun<char>(); //<------------ UNEXPECTED: THIS FAILS
|
||||
b_defaulted.template fun<char>(); //<------------ THIS IS FINE
|
||||
|
||||
b_explicited.fun<char>(); //<------------ UNEXPECTED: THIS FAILS
|
||||
b_explicited.template fun<char>();//<------------ THIS IS FINE
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
tfun<int>();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user