From 0e7db5934151b5ce3fd812475531015e6e5a8a05 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 6 Dec 2012 14:37:13 +0000 Subject: [PATCH] PR c++/55015 PR c++/53821 * semantics.c (maybe_add_lambda_conv_op): Revert earlier change. * decl.c (start_preparsed_function): Make local class methods comdat in templates, too. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194251 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 5 ++--- gcc/cp/semantics.c | 4 ++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C | 7 +++++++ 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 04a71f2..1a1f459 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2012-12-06 Jason Merrill + PR c++/55015 + PR c++/53821 + * semantics.c (maybe_add_lambda_conv_op): Revert earlier change. + * decl.c (start_preparsed_function): Make local class methods comdat + in templates, too. + PR c++/54653 * parser.c (cp_parser_class_head): A partial specialization scope counts as a template. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index bae48ce..cdda2f4 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -13199,10 +13199,9 @@ start_preparsed_function (tree decl1, tree attrs, int flags) if (DECL_NOT_REALLY_EXTERN (decl1)) DECL_EXTERNAL (decl1) = 0; - if (ctx != NULL_TREE && DECL_DECLARED_INLINE_P (ctx) - && TREE_PUBLIC (ctx)) + if (ctx != NULL_TREE && vague_linkage_p (ctx)) /* This is a function in a local class in an extern inline - function. */ + or template function. */ comdat_linkage (decl1); } /* If this function belongs to an interface, it is public. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index eaf7069..53e849a 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9419,6 +9419,8 @@ maybe_add_lambda_conv_op (tree type) DECL_NOT_REALLY_EXTERN (fn) = 1; DECL_DECLARED_INLINE_P (fn) = 1; DECL_ARGUMENTS (fn) = build_this_parm (fntype, TYPE_QUAL_CONST); + if (nested) + DECL_INTERFACE_KNOWN (fn) = 1; add_method (type, fn, NULL_TREE); @@ -9449,6 +9451,8 @@ maybe_add_lambda_conv_op (tree type) DECL_ARGUMENTS (fn) = copy_list (DECL_CHAIN (DECL_ARGUMENTS (callop))); for (arg = DECL_ARGUMENTS (fn); arg; arg = DECL_CHAIN (arg)) DECL_CONTEXT (arg) = fn; + if (nested) + DECL_INTERFACE_KNOWN (fn) = 1; add_method (type, fn, NULL_TREE); diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C new file mode 100644 index 0000000..bd90437 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv6.C @@ -0,0 +1,7 @@ +// PR c++/55015 +// { dg-do link } +// { dg-options -std=c++11 } + +typedef void (*VoidFunc)(); +inline VoidFunc GetFunc() { return [](){}; } +int main() { VoidFunc func = GetFunc(); } -- 2.7.4