Message ID | 87hajt61f7.fsf@euclid.axiomatics.org |
---|---|
State | New |
Headers | show |
On 03/29/2013 10:56 PM, Gabriel Dos Reis wrote:
> int wanted = num_template_headers_for_class (ctx);
I think you want to add one to wanted if decl is a primary template.
Jason
On Sun, Mar 31, 2013 at 12:13 AM, Jason Merrill <jason@redhat.com> wrote: > > On 03/29/2013 10:56 PM, Gabriel Dos Reis wrote: >> >> int wanted = num_template_headers_for_class (ctx); > > > I think you want to add one to wanted if decl is a primary template. OK but I am a little bit dense here: why is that necessary? -- Gaby
On 04/01/2013 04:53 PM, Gabriel Dos Reis wrote: > On Sun, Mar 31, 2013 at 12:13 AM, Jason Merrill <jason@redhat.com> wrote: >> >> On 03/29/2013 10:56 PM, Gabriel Dos Reis wrote: >>> >>> int wanted = num_template_headers_for_class (ctx); >> >> I think you want to add one to wanted if decl is a primary template. > > OK but I am a little bit dense here: why is that necessary? By 'primary' I mean something that is itself a template, not just a member of a class template. Previously variables couldn't be primary templates, but I believe your proposal is to change that; in that case, we should expect to see a template header for such a template, in addition to any headers for enclosing classes. Jason
On Mon, Apr 1, 2013 at 3:58 PM, Jason Merrill <jason@redhat.com> wrote: > On 04/01/2013 04:53 PM, Gabriel Dos Reis wrote: >> >> On Sun, Mar 31, 2013 at 12:13 AM, Jason Merrill <jason@redhat.com> wrote: >>> >>> >>> On 03/29/2013 10:56 PM, Gabriel Dos Reis wrote: >>>> >>>> >>>> int wanted = num_template_headers_for_class (ctx); >>> >>> >>> I think you want to add one to wanted if decl is a primary template. >> >> >> OK but I am a little bit dense here: why is that necessary? > > > By 'primary' I mean something that is itself a template, not just a member > of a class template. Previously variables couldn't be primary templates, > but I believe your proposal is to change that; in that case, we should > expect to see a template header for such a template, in addition to any > headers for enclosing classes. Ah, yes; got it. Thanks! -- Gaby
Index: gcc/cp/cp-tree.h =================================================================== --- gcc/cp/cp-tree.h (revision 197259) +++ gcc/cp/cp-tree.h (working copy) @@ -4930,8 +4930,7 @@ inline bool variable_template_p (tree t) { - if (TREE_CODE (t) != TEMPLATE_DECL - || !(DECL_NAMESPACE_SCOPE_P (t) || DECL_MEMBER_TEMPLATE_P (t))) + if (TREE_CODE (t) != TEMPLATE_DECL) return false; if (tree r = DECL_TEMPLATE_RESULT (t)) return VAR_P (r); Index: gcc/cp/pt.c =================================================================== --- gcc/cp/pt.c (revision 197259) +++ gcc/cp/pt.c (working copy) @@ -2275,7 +2275,7 @@ permerror (DECL_SOURCE_LOCATION (decl), "%qD is not a static data member of a class template", decl); } - else if (template_header_count > wanted) + if (template_header_count > wanted) { pedwarn (DECL_SOURCE_LOCATION (decl), 0, "too many template headers for %D (should be %d)", @@ -4618,10 +4618,11 @@ && TYPE_DECL_ALIAS_P (decl)) /* alias-declaration */ gcc_assert (!DECL_ARTIFICIAL (decl)); - else if (VAR_P (decl)) { - if (!DECL_DECLARED_CONSTEXPR_P (decl)) - error ("template declaration of non-constexpr variable %qD", decl); - } + else if (VAR_P (decl)) + { + if (!DECL_DECLARED_CONSTEXPR_P (decl)) + error ("template declaration of non-constexpr variable %qD", decl); + } else { error ("template declaration of %q#D", decl);