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:
Jason Merrill 2013-03-27 14:21:12 -04:00 committed by Jason Merrill
parent f49b33cb22
commit d348f17260
3 changed files with 67 additions and 0 deletions

View File

@ -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.

View File

@ -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)

View 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;
}