Hi,
On 30/10/18 21:37, Jason Merrill wrote:
On 10/26/18 2:02 PM, Paolo Carlini wrote:
On 26/10/18 17:18, Jason Merrill wrote:
On Fri, Oct 26, 2018 at 4:52 AM Paolo Carlini
<paolo.carl...@oracle.com> wrote:
On 24/10/18 22:41, Jason Merrill wrote:
On 10/15/18 12:45 PM, Paolo Carlini wrote:
&& ((TREE_CODE (declspecs->type) != TYPENAME_TYPE
+ && TREE_CODE (declspecs->type) != DECLTYPE_TYPE
&& MAYBE_CLASS_TYPE_P (declspecs->type))
I would think that the MAYBE_CLASS_TYPE_P here should be
CLASS_TYPE_P,
and then we can remove the TYPENAME_TYPE check. Or do we want to
allow template type parameters for some reason?
Indeed, it would be nice to just use OVERLOAD_TYPE_P. However it seems
we at least want to let through TEMPLATE_TYPE_PARMs representing
'auto'
- otherwise Dodji's check a few lines below which fixed c++/51473
doesn't work anymore - and also BOUND_TEMPLATE_TEMPLATE_PARM,
otherwise
we regress on template/spec32.C and template/ttp22.C because we don't
diagnose the shadowing anymore. Thus, I would say either we keep on
using MAYBE_CLASS_TYPE_P or we pick what we need, possibly we add a
comment?
Aha. I guess the answer is not to restrict that test any more, but
instead to fix the code further down so it gives a proper diagnostic
rather than call warn_misplaced_attr_for_class_type.
I see. Thus something like the below? It passes testing on x86_64-linux.
+ if ((!declared_type || TREE_CODE (declared_type) == DECLTYPE_TYPE)
+ && ! saw_friend && !error_p)
permerror (input_location, "declaration does not declare
anything");
I see no reason to make this specific to decltype. Maybe move this
diagnostic into the final 'else' block with the other declspec
diagnostics and not look at declared_type at all?
I'm not sure to fully understand: if we do that we still want to at
least minimally check that declared_type is null, like we already do,
and then we simply accept the new testcase. Is that Ok? Because, as I
probably mentioned at some point, all the other compilers I have at hand
issue a "does not declare anything" diagnostic, and we likewise do that
for the legacy __typeof. Not looking into declared_type *at all* doesn't
work with plain class types and enums, of course. Or you meant something
entirely different??
+ if (declspecs->attributes && warn_attributes && declared_type
+ && TREE_CODE (declared_type) != DECLTYPE_TYPE)
I think we do want to give a diagnostic about useless attributes, not
skip it.
Agreed. FWIW the attached tests fine.
Thanks, Paolo.
///////////////////
Index: decl.c
===================================================================
--- decl.c (revision 265636)
+++ decl.c (working copy)
@@ -4798,9 +4798,7 @@ check_tag_decl (cp_decl_specifier_seq *declspecs,
declared_type = declspecs->type;
else if (declspecs->type == error_mark_node)
error_p = true;
- if (declared_type == NULL_TREE && ! saw_friend && !error_p)
- permerror (input_location, "declaration does not declare anything");
- else if (declared_type != NULL_TREE && type_uses_auto (declared_type))
+ if (declared_type && type_uses_auto (declared_type))
{
error_at (declspecs->locations[ds_type_spec],
"%<auto%> can only be specified for variables "
@@ -4842,7 +4840,9 @@ check_tag_decl (cp_decl_specifier_seq *declspecs,
else
{
- if (decl_spec_seq_has_spec_p (declspecs, ds_inline))
+ if (!declared_type && ! saw_friend && !error_p)
+ permerror (input_location, "declaration does not declare anything");
+ else if (decl_spec_seq_has_spec_p (declspecs, ds_inline))
error_at (declspecs->locations[ds_inline],
"%<inline%> can only be specified for functions");
else if (decl_spec_seq_has_spec_p (declspecs, ds_virtual))
@@ -4909,7 +4909,7 @@ check_tag_decl (cp_decl_specifier_seq *declspecs,
"no attribute can be applied to "
"an explicit instantiation");
}
- else
+ else if (TREE_CODE (declared_type) != DECLTYPE_TYPE)
warn_misplaced_attr_for_class_type (loc, declared_type);
}