From e75e98f270478aca1c8c823171e8d29d471bfc87 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 13 Feb 2013 23:30:26 -0500 Subject: [PATCH] re PR c++/55680 ([C++11] Member specialization with lambda is rejected) PR c++/55680 * pt.c (maybe_process_partial_specialization): A lambda isn't what's being specialized. From-SVN: r196042 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 5 +++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C | 7 +++++++ 3 files changed, 16 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7cb0653cea1..d28a6049a81 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-02-13 Jason Merrill + PR c++/55680 + * pt.c (maybe_process_partial_specialization): A lambda + isn't what's being specialized. + PR c++/55710 * semantics.c (maybe_add_lambda_conv_op): Mark static thunk TREE_USED. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2aadd4d0bf4..bd44fdebb8c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -802,6 +802,11 @@ maybe_process_partial_specialization (tree type) if (type == error_mark_node) return error_mark_node; + /* A lambda that appears in specialization context is not itself a + specialization. */ + if (CLASS_TYPE_P (type) && CLASSTYPE_LAMBDA_EXPR (type)) + return type; + if (TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM) { error ("name of class shadows template template parameter %qD", diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C new file mode 100644 index 00000000000..720941dbc2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template8.C @@ -0,0 +1,7 @@ +// PR c++/55680 +// { dg-do compile { target c++11 } } + +template struct X { + static void (* code ) (); +}; +template <> void (* X::code ) () = [](){}; -- 2.30.2