Commit 247ecdf3 by Paolo Carlini Committed by Paolo Carlini

re PR c++/60753 (Deleted definition of an explicit function template…

re PR c++/60753 (Deleted definition of an explicit function template specialization, following a declaration, incorrectly accepted)

/cp
2015-01-08  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/60753
	* decl.c (grokfndecl): Add bool parameter.
	(grokdeclarator): Adjust calls.
	(start_decl): Don't set DECL_DELETED_FN here.

/testsuite
2015-01-08  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/60753
	* g++.dg/cpp0x/deleted10.C: New.

From-SVN: r219347
parent 45f46750
2015-01-08 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60753
* decl.c (grokfndecl): Add bool parameter.
(grokdeclarator): Adjust calls.
(start_decl): Don't set DECL_DELETED_FN here.
2015-01-06 Jason Merrill <jason@redhat.com> 2015-01-06 Jason Merrill <jason@redhat.com>
* parser.c (cp_parser_nested_name_specifier_opt): Diagnose invalid * parser.c (cp_parser_nested_name_specifier_opt): Diagnose invalid
......
...@@ -4631,26 +4631,15 @@ start_decl (const cp_declarator *declarator, ...@@ -4631,26 +4631,15 @@ start_decl (const cp_declarator *declarator,
if (context != global_namespace) if (context != global_namespace)
*pushed_scope_p = push_scope (context); *pushed_scope_p = push_scope (context);
if (initialized) /* Is it valid for this decl to have an initializer at all?
/* Is it valid for this decl to have an initializer at all? If not, set INITIALIZED to zero, which will indirectly
If not, set INITIALIZED to zero, which will indirectly tell `cp_finish_decl' to ignore the initializer once it is parsed. */
tell `cp_finish_decl' to ignore the initializer once it is parsed. */ if (initialized
switch (TREE_CODE (decl)) && TREE_CODE (decl) == TYPE_DECL)
{ {
case TYPE_DECL: error ("typedef %qD is initialized (use decltype instead)", decl);
error ("typedef %qD is initialized (use decltype instead)", decl); return error_mark_node;
return error_mark_node; }
case FUNCTION_DECL:
if (initialized == SD_DELETED)
/* We'll handle the rest of the semantics later, but we need to
set this now so it's visible to duplicate_decls. */
DECL_DELETED_FN (decl) = 1;
break;
default:
break;
}
if (initialized) if (initialized)
{ {
...@@ -7630,6 +7619,7 @@ grokfndecl (tree ctype, ...@@ -7630,6 +7619,7 @@ grokfndecl (tree ctype,
int friendp, int friendp,
int publicp, int publicp,
int inlinep, int inlinep,
bool deletedp,
special_function_kind sfk, special_function_kind sfk,
bool funcdef_flag, bool funcdef_flag,
int template_count, int template_count,
...@@ -7768,6 +7758,9 @@ grokfndecl (tree ctype, ...@@ -7768,6 +7758,9 @@ grokfndecl (tree ctype,
DECL_CONTEXT (decl) = ctype; DECL_CONTEXT (decl) = ctype;
} }
if (deletedp)
DECL_DELETED_FN (decl) = 1;
if (ctype) if (ctype)
{ {
DECL_CONTEXT (decl) = ctype; DECL_CONTEXT (decl) = ctype;
...@@ -10756,7 +10749,7 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10756,7 +10749,7 @@ grokdeclarator (const cp_declarator *declarator,
virtualp, flags, memfn_quals, rqual, raises, virtualp, flags, memfn_quals, rqual, raises,
friendp ? -1 : 0, friendp, publicp, friendp ? -1 : 0, friendp, publicp,
inlinep | (2 * constexpr_p), inlinep | (2 * constexpr_p),
sfk, initialized == SD_DELETED, sfk,
funcdef_flag, template_count, in_namespace, funcdef_flag, template_count, in_namespace,
attrlist, declarator->id_loc); attrlist, declarator->id_loc);
decl = set_virt_specifiers (decl, virt_specifiers); decl = set_virt_specifiers (decl, virt_specifiers);
...@@ -10978,7 +10971,8 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -10978,7 +10971,8 @@ grokdeclarator (const cp_declarator *declarator,
decl = grokfndecl (ctype, type, original_name, parms, unqualified_id, decl = grokfndecl (ctype, type, original_name, parms, unqualified_id,
virtualp, flags, memfn_quals, rqual, raises, virtualp, flags, memfn_quals, rqual, raises,
1, friendp, 1, friendp,
publicp, inlinep | (2 * constexpr_p), sfk, publicp, inlinep | (2 * constexpr_p),
initialized == SD_DELETED, sfk,
funcdef_flag, funcdef_flag,
template_count, in_namespace, attrlist, template_count, in_namespace, attrlist,
declarator->id_loc); declarator->id_loc);
......
2015-01-08 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60753
* g++.dg/cpp0x/deleted10.C: New.
2015-01-07 David Malcolm <dmalcolm@redhat.com> 2015-01-07 David Malcolm <dmalcolm@redhat.com>
* jit.dg/test-error-dereferencing-void-ptr.c: New test case. * jit.dg/test-error-dereferencing-void-ptr.c: New test case.
......
// PR c++/60753
// { dg-do compile { target c++11 } }
template<class T> void foo (T);
template<> void foo<int> (int);
template<> void foo<int> (int) = delete; // { dg-error "deleted" }
struct S
{
template<class T> void bar (T);
};
template<> void S::bar<int> (int);
template<> void S::bar<int> (int) = delete; // { dg-error "deleted" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment