This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [var-template] Accept variable template declaration
- From: Gabriel Dos Reis <gdr at axiomatics dot org>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 29 Mar 2013 21:56:12 -0500
- Subject: Re: [var-template] Accept variable template declaration
- References: <87ip49et6x dot fsf at euclid dot axiomatics dot org> <515638D3 dot 8010404 at redhat dot com>
Jason Merrill <jason@redhat.com> writes:
| On 03/29/2013 06:29 PM, Gabriel Dos Reis wrote:
| > + if (TREE_CODE (t) != TEMPLATE_DECL
| > + || !(DECL_NAMESPACE_SCOPE_P (t) || DECL_MEMBER_TEMPLATE_P (t)))
|
| Why check the scope?
ah right, if it is a template the scope was already checked.
| > - if (!TYPE_P (ctx) || !CLASSTYPE_TEMPLATE_INFO (ctx))
| > - permerror (DECL_SOURCE_LOCATION (decl),
| > - "%qD is not a static data member of a class template", decl);
| > + if (!TYPE_P (ctx) || !CLASSTYPE_TEMPLATE_INFO (ctx)) {
| > + if (cxx_dialect < cxx1y)
| > + permerror (DECL_SOURCE_LOCATION (decl),
| > + "%qD is not a static data member of a class template", decl);
| > + }
| > else if (template_header_count > wanted)
|
| I think we still want to check for excess template headers.
right your are.
| > + else if (VAR_P (decl)) {
| > + if (!DECL_DECLARED_CONSTEXPR_P (decl))
| > + error ("template declaration of non-constexpr variable %qD", decl);
| > + }
|
| Open brace should be on a line by itself.
oops, fixed. Too many coding standards...
-- Gaby
2013-03-29 Gabriel Dos Reis <gdr@integrable-solutions.net>
* cp-tree.h (variable_template_p): Do not check scope.
* pt.c (check_template_variable): Fix thinko from previous change.
(push_template_decl_real): Fix formatting.
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);