* [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl @ 2019-06-23 11:58 Paolo Carlini 2019-07-05 19:48 ` [C++ Patch PING] " Paolo Carlini 2019-07-08 21:56 ` Jason Merrill 0 siblings, 2 replies; 5+ messages in thread From: Paolo Carlini @ 2019-06-23 11:58 UTC (permalink / raw) To: gcc-patches; +Cc: Jason Merrill [-- Attachment #1: Type: text/plain, Size: 270 bytes --] Hi, here there are a couple of rather straightforward improvements in the second half of grokdeclarator plus a check_tag_decl change consistent with the other existing case of multiple_types_p diagnostic. Tested x86_64-linux. Thanks, Paolo. ///////////////////// [-- Attachment #2: CL_locs_37_2 --] [-- Type: text/plain, Size: 648 bytes --] /cp 2019-06-23 Paolo Carlini <paolo.carlini@oracle.com> * decl.c (get_type_quals): New. (check_tag_decl): Use smallest_type_location and the latter in error_at about multiple types in one declaration. (grokdeclarator): Use locations[ds_storage_class] in error_at about static cdtor; use id_loc in error_at about flexible array member in union; use get_type_quals. /testsuite 2019-06-23 Paolo Carlini <paolo.carlini@oracle.com> * g++.dg/diagnostic/static-cdtor-1.C: New. * g++.dg/cpp1z/has-unique-obj-representations2.C: Test location too. * g++.dg/other/anon-union3.C: Adjust expected location. * g++.dg/parse/error8.C: Likewise. [-- Attachment #3: patch_locs_37_2 --] [-- Type: text/plain, Size: 6111 bytes --] Index: cp/decl.c =================================================================== --- cp/decl.c (revision 272584) +++ cp/decl.c (working copy) @@ -100,6 +100,7 @@ static tree build_cp_library_fn (tree, enum tree_c static void store_parm_decls (tree); static void initialize_local_var (tree, tree); static void expand_static_init (tree, tree); +static location_t smallest_type_location (int, const location_t*); /* The following symbols are subsumed in the cp_global_trees array, and listed here individually for documentation purposes. @@ -4802,6 +4803,24 @@ warn_misplaced_attr_for_class_type (location_t loc class_type, class_key_or_enum_as_string (class_type)); } +/* Returns the cv-qualifiers that apply to the type specified + by the DECLSPECS. */ + +static int +get_type_quals (const cp_decl_specifier_seq *declspecs) +{ + int type_quals = TYPE_UNQUALIFIED; + + if (decl_spec_seq_has_spec_p (declspecs, ds_const)) + type_quals |= TYPE_QUAL_CONST; + if (decl_spec_seq_has_spec_p (declspecs, ds_volatile)) + type_quals |= TYPE_QUAL_VOLATILE; + if (decl_spec_seq_has_spec_p (declspecs, ds_restrict)) + type_quals |= TYPE_QUAL_RESTRICT; + + return type_quals; +} + /* Make sure that a declaration with no declarator is well-formed, i.e. just declares a tagged type or anonymous union. @@ -4821,7 +4840,9 @@ check_tag_decl (cp_decl_specifier_seq *declspecs, bool error_p = false; if (declspecs->multiple_types_p) - error ("multiple types in one declaration"); + error_at (smallest_type_location (get_type_quals (declspecs), + declspecs->locations), + "multiple types in one declaration"); else if (declspecs->redefined_builtin_type) { if (!in_system_header_at (input_location)) @@ -10403,7 +10424,7 @@ grokdeclarator (const cp_declarator *declarator, a member function. */ cp_ref_qualifier rqual = REF_QUAL_NONE; /* cv-qualifiers that apply to the type specified by the DECLSPECS. */ - int type_quals = TYPE_UNQUALIFIED; + int type_quals = get_type_quals (declspecs); tree raises = NULL_TREE; int template_count = 0; tree returned_attrs = NULL_TREE; @@ -10449,13 +10470,6 @@ grokdeclarator (const cp_declarator *declarator, if (concept_p) constexpr_p = true; - if (decl_spec_seq_has_spec_p (declspecs, ds_const)) - type_quals |= TYPE_QUAL_CONST; - if (decl_spec_seq_has_spec_p (declspecs, ds_volatile)) - type_quals |= TYPE_QUAL_VOLATILE; - if (decl_spec_seq_has_spec_p (declspecs, ds_restrict)) - type_quals |= TYPE_QUAL_RESTRICT; - if (decl_context == FUNCDEF) funcdef_flag = true, decl_context = NORMAL; else if (decl_context == MEMFUNCDEF) @@ -11571,9 +11585,12 @@ grokdeclarator (const cp_declarator *declarator, virtual. A constructor may not be static. A constructor may not be declared with ref-qualifier. */ if (staticp == 2) - error ((flags == DTOR_FLAG) - ? G_("destructor cannot be static member function") - : G_("constructor cannot be static member function")); + error_at (declspecs->locations[ds_storage_class], + (flags == DTOR_FLAG) + ? G_("destructor cannot be static member " + "function") + : G_("constructor cannot be static member " + "function")); if (memfn_quals) { error ((flags == DTOR_FLAG) @@ -12431,7 +12448,7 @@ grokdeclarator (const cp_declarator *declarator, && (TREE_CODE (ctype) == UNION_TYPE || TREE_CODE (ctype) == QUAL_UNION_TYPE)) { - error ("flexible array member in union"); + error_at (id_loc, "flexible array member in union"); type = error_mark_node; } else Index: testsuite/g++.dg/cpp1z/has-unique-obj-representations2.C =================================================================== --- testsuite/g++.dg/cpp1z/has-unique-obj-representations2.C (revision 272583) +++ testsuite/g++.dg/cpp1z/has-unique-obj-representations2.C (working copy) @@ -1,7 +1,7 @@ struct S; struct T { S t; }; // { dg-error "incomplete type" } struct U { int u[sizeof (S)]; }; // { dg-error "incomplete type" } -union V { char c; char d[]; }; // { dg-error "flexible array member in union" } +union V { char c; char d[]; }; // { dg-error "24:flexible array member in union" } bool a = __has_unique_object_representations (S); // { dg-error "incomplete type" } bool b = __has_unique_object_representations (T); bool c = __has_unique_object_representations (U); Index: testsuite/g++.dg/diagnostic/static-cdtor-1.C =================================================================== --- testsuite/g++.dg/diagnostic/static-cdtor-1.C (nonexistent) +++ testsuite/g++.dg/diagnostic/static-cdtor-1.C (working copy) @@ -0,0 +1,5 @@ +struct S +{ + static S(); // { dg-error "3:constructor" } + static ~S(); // { dg-error "3:destructor" } +}; Index: testsuite/g++.dg/other/anon-union3.C =================================================================== --- testsuite/g++.dg/other/anon-union3.C (revision 272583) +++ testsuite/g++.dg/other/anon-union3.C (working copy) @@ -3,9 +3,9 @@ class C { auto union // { dg-error "storage class" "" { target { ! c++11 } } } - { // { dg-error "auto" "" { target c++11 } .-1 } + { // { dg-error "auto|multiple types" "" { target c++11 } .-1 } int a; - }; // { dg-error "multiple types" "" { target c++11 } } + }; register union // { dg-error "storage class" } { int b; Index: testsuite/g++.dg/parse/error8.C =================================================================== --- testsuite/g++.dg/parse/error8.C (revision 272583) +++ testsuite/g++.dg/parse/error8.C (working copy) @@ -5,5 +5,5 @@ struct A { friend typename struct B; }; // { dg-error "28:expected nested-name-specifier before 'struct'" "expected" { target *-*-* } 4 } -// { dg-error "35:multiple types in one declaration" "multiple" { target *-*-* } 4 } +// { dg-error "19:multiple types in one declaration" "multiple" { target *-*-* } 4 } // { dg-error "12:friend declaration does not name a class or function" "friend decl" { target *-*-* } 4 } ^ permalink raw reply [flat|nested] 5+ messages in thread
* [C++ Patch PING] Re: [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl 2019-06-23 11:58 [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl Paolo Carlini @ 2019-07-05 19:48 ` Paolo Carlini 2019-07-08 21:56 ` Jason Merrill 1 sibling, 0 replies; 5+ messages in thread From: Paolo Carlini @ 2019-07-05 19:48 UTC (permalink / raw) To: gcc-patches; +Cc: Jason Merrill Hi, On 23/06/19 13:58, Paolo Carlini wrote: > Hi, > > here there are a couple of rather straightforward improvements in the > second half of grokdeclarator plus a check_tag_decl change consistent > with the other existing case of multiple_types_p diagnostic. Tested > x86_64-linux. Gently pinging this... Â Â Â https://gcc.gnu.org/ml/gcc-patches/2019-06/msg01391.html Thanks, Paolo. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl 2019-06-23 11:58 [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl Paolo Carlini 2019-07-05 19:48 ` [C++ Patch PING] " Paolo Carlini @ 2019-07-08 21:56 ` Jason Merrill 2019-07-09 10:17 ` Paolo Carlini 1 sibling, 1 reply; 5+ messages in thread From: Jason Merrill @ 2019-07-08 21:56 UTC (permalink / raw) To: Paolo Carlini, gcc-patches On 6/23/19 7:58 AM, Paolo Carlini wrote: > + error_at (smallest_type_location (get_type_quals (declspecs), > + declspecs->locations), How about adding a smallest_type_location overload that just takes declspecs? Jason ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl 2019-07-08 21:56 ` Jason Merrill @ 2019-07-09 10:17 ` Paolo Carlini 2019-07-09 21:14 ` Jason Merrill 0 siblings, 1 reply; 5+ messages in thread From: Paolo Carlini @ 2019-07-09 10:17 UTC (permalink / raw) To: Jason Merrill, gcc-patches [-- Attachment #1: Type: text/plain, Size: 543 bytes --] Hi, On 08/07/19 23:44, Jason Merrill wrote: > On 6/23/19 7:58 AM, Paolo Carlini wrote: >> +Â Â Â error_at (smallest_type_location (get_type_quals (declspecs), >> +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â declspecs->locations), > How about adding a smallest_type_location overload that just takes > declspecs? Sure. The below has an additional location fixlet which I noticed over the last days, for "complex invalid for". Tested x86_64-linux, as usual. Thanks, Paolo. //////////////// [-- Attachment #2: CL_locs_37_3 --] [-- Type: text/plain, Size: 803 bytes --] /cp 2019-07-09 Paolo Carlini <paolo.carlini@oracle.com> * decl.c (get_type_quals, smallest_type_location (const cp_decl_specifier_seq*)): New. (check_tag_decl): Use smallest_type_location in error_at about multiple types in one declaration. (grokdeclarator): Use locations[ds_complex] in error_at about complex invalid; use locations[ds_storage_class] in error_at about static cdtor; use id_loc in error_at about flexible array member in union; use get_type_quals. /testsuite 2019-07-09 Paolo Carlini <paolo.carlini@oracle.com> * g++.dg/diagnostic/complex-invalid-1.C: New. * g++.dg/diagnostic/static-cdtor-1.C: Likewise. * g++.dg/cpp1z/has-unique-obj-representations2.C: Test location too. * g++.dg/other/anon-union3.C: Adjust expected location. * g++.dg/parse/error8.C: Likewise. [-- Attachment #3: patch_locs_37_3 --] [-- Type: text/plain, Size: 7479 bytes --] Index: cp/decl.c =================================================================== --- cp/decl.c (revision 273227) +++ cp/decl.c (working copy) @@ -100,6 +100,7 @@ static tree build_cp_library_fn (tree, enum tree_c static void store_parm_decls (tree); static void initialize_local_var (tree, tree); static void expand_static_init (tree, tree); +static location_t smallest_type_location (const cp_decl_specifier_seq*); /* The following symbols are subsumed in the cp_global_trees array, and listed here individually for documentation purposes. @@ -4802,6 +4803,24 @@ warn_misplaced_attr_for_class_type (location_t loc class_type, class_key_or_enum_as_string (class_type)); } +/* Returns the cv-qualifiers that apply to the type specified + by the DECLSPECS. */ + +static int +get_type_quals (const cp_decl_specifier_seq *declspecs) +{ + int type_quals = TYPE_UNQUALIFIED; + + if (decl_spec_seq_has_spec_p (declspecs, ds_const)) + type_quals |= TYPE_QUAL_CONST; + if (decl_spec_seq_has_spec_p (declspecs, ds_volatile)) + type_quals |= TYPE_QUAL_VOLATILE; + if (decl_spec_seq_has_spec_p (declspecs, ds_restrict)) + type_quals |= TYPE_QUAL_RESTRICT; + + return type_quals; +} + /* Make sure that a declaration with no declarator is well-formed, i.e. just declares a tagged type or anonymous union. @@ -4821,7 +4840,8 @@ check_tag_decl (cp_decl_specifier_seq *declspecs, bool error_p = false; if (declspecs->multiple_types_p) - error ("multiple types in one declaration"); + error_at (smallest_type_location (declspecs), + "multiple types in one declaration"); else if (declspecs->redefined_builtin_type) { if (!in_system_header_at (input_location)) @@ -10142,6 +10162,13 @@ smallest_type_location (int type_quals, const loca return min_location (loc, locations[ds_type_spec]); } +static location_t +smallest_type_location (const cp_decl_specifier_seq *declspecs) +{ + int type_quals = get_type_quals (declspecs); + return smallest_type_location (type_quals, declspecs->locations); +} + /* Check that it's OK to declare a function with the indicated TYPE and TYPE_QUALS. SFK indicates the kind of special function (if any) that this function is. OPTYPE is the type given in a conversion @@ -10407,7 +10434,7 @@ grokdeclarator (const cp_declarator *declarator, a member function. */ cp_ref_qualifier rqual = REF_QUAL_NONE; /* cv-qualifiers that apply to the type specified by the DECLSPECS. */ - int type_quals = TYPE_UNQUALIFIED; + int type_quals = get_type_quals (declspecs); tree raises = NULL_TREE; int template_count = 0; tree returned_attrs = NULL_TREE; @@ -10454,13 +10481,6 @@ grokdeclarator (const cp_declarator *declarator, if (concept_p) constexpr_p = true; - if (decl_spec_seq_has_spec_p (declspecs, ds_const)) - type_quals |= TYPE_QUAL_CONST; - if (decl_spec_seq_has_spec_p (declspecs, ds_volatile)) - type_quals |= TYPE_QUAL_VOLATILE; - if (decl_spec_seq_has_spec_p (declspecs, ds_restrict)) - type_quals |= TYPE_QUAL_RESTRICT; - if (decl_context == FUNCDEF) funcdef_flag = true, decl_context = NORMAL; else if (decl_context == MEMFUNCDEF) @@ -10999,7 +11019,8 @@ grokdeclarator (const cp_declarator *declarator, if (decl_spec_seq_has_spec_p (declspecs, ds_complex)) { if (TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE) - error ("complex invalid for %qs", name); + error_at (declspecs->locations[ds_complex], + "complex invalid for %qs", name); /* If a modifier is specified, the resulting complex is the complex form of TYPE. E.g, "complex short" is "complex short int". */ else if (type == integer_type_node) @@ -11578,9 +11599,12 @@ grokdeclarator (const cp_declarator *declarator, virtual. A constructor may not be static. A constructor may not be declared with ref-qualifier. */ if (staticp == 2) - error ((flags == DTOR_FLAG) - ? G_("destructor cannot be static member function") - : G_("constructor cannot be static member function")); + error_at (declspecs->locations[ds_storage_class], + (flags == DTOR_FLAG) + ? G_("destructor cannot be static member " + "function") + : G_("constructor cannot be static member " + "function")); if (memfn_quals) { error ((flags == DTOR_FLAG) @@ -12438,7 +12462,7 @@ grokdeclarator (const cp_declarator *declarator, && (TREE_CODE (ctype) == UNION_TYPE || TREE_CODE (ctype) == QUAL_UNION_TYPE)) { - error ("flexible array member in union"); + error_at (id_loc, "flexible array member in union"); type = error_mark_node; } else Index: testsuite/g++.dg/cpp1z/has-unique-obj-representations2.C =================================================================== --- testsuite/g++.dg/cpp1z/has-unique-obj-representations2.C (revision 273227) +++ testsuite/g++.dg/cpp1z/has-unique-obj-representations2.C (working copy) @@ -1,7 +1,7 @@ struct S; struct T { S t; }; // { dg-error "incomplete type" } struct U { int u[sizeof (S)]; }; // { dg-error "incomplete type" } -union V { char c; char d[]; }; // { dg-error "flexible array member in union" } +union V { char c; char d[]; }; // { dg-error "24:flexible array member in union" } bool a = __has_unique_object_representations (S); // { dg-error "incomplete type" } bool b = __has_unique_object_representations (T); bool c = __has_unique_object_representations (U); Index: testsuite/g++.dg/diagnostic/complex-invalid-1.C =================================================================== --- testsuite/g++.dg/diagnostic/complex-invalid-1.C (nonexistent) +++ testsuite/g++.dg/diagnostic/complex-invalid-1.C (working copy) @@ -0,0 +1 @@ +__complex__ bool b; // { dg-error "1:complex invalid" } Index: testsuite/g++.dg/diagnostic/static-cdtor-1.C =================================================================== --- testsuite/g++.dg/diagnostic/static-cdtor-1.C (nonexistent) +++ testsuite/g++.dg/diagnostic/static-cdtor-1.C (working copy) @@ -0,0 +1,5 @@ +struct S +{ + static S(); // { dg-error "3:constructor" } + static ~S(); // { dg-error "3:destructor" } +}; Index: testsuite/g++.dg/other/anon-union3.C =================================================================== --- testsuite/g++.dg/other/anon-union3.C (revision 273227) +++ testsuite/g++.dg/other/anon-union3.C (working copy) @@ -3,9 +3,9 @@ class C { auto union // { dg-error "storage class" "" { target { ! c++11 } } } - { // { dg-error "auto" "" { target c++11 } .-1 } + { // { dg-error "auto|multiple types" "" { target c++11 } .-1 } int a; - }; // { dg-error "multiple types" "" { target c++11 } } + }; register union // { dg-error "storage class" } { int b; Index: testsuite/g++.dg/parse/error8.C =================================================================== --- testsuite/g++.dg/parse/error8.C (revision 273227) +++ testsuite/g++.dg/parse/error8.C (working copy) @@ -5,5 +5,5 @@ struct A { friend typename struct B; }; // { dg-error "28:expected nested-name-specifier before 'struct'" "expected" { target *-*-* } 4 } -// { dg-error "35:multiple types in one declaration" "multiple" { target *-*-* } 4 } +// { dg-error "19:multiple types in one declaration" "multiple" { target *-*-* } 4 } // { dg-error "12:friend declaration does not name a class or function" "friend decl" { target *-*-* } 4 } ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl 2019-07-09 10:17 ` Paolo Carlini @ 2019-07-09 21:14 ` Jason Merrill 0 siblings, 0 replies; 5+ messages in thread From: Jason Merrill @ 2019-07-09 21:14 UTC (permalink / raw) To: Paolo Carlini, gcc-patches On 7/9/19 6:10 AM, Paolo Carlini wrote: > Hi, > > On 08/07/19 23:44, Jason Merrill wrote: >> On 6/23/19 7:58 AM, Paolo Carlini wrote: >>> +Â Â Â error_at (smallest_type_location (get_type_quals (declspecs), >>> +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â declspecs->locations), >> How about adding a smallest_type_location overload that just takes >> declspecs? > > Sure. The below has an additional location fixlet which I noticed over > the last days, for "complex invalid for". Tested x86_64-linux, as usual. OK, thanks. Jason ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-07-09 21:03 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-06-23 11:58 [C++ Patch] A few additional location improvements to grokdeclarator and check_tag_decl Paolo Carlini 2019-07-05 19:48 ` [C++ Patch PING] " Paolo Carlini 2019-07-08 21:56 ` Jason Merrill 2019-07-09 10:17 ` Paolo Carlini 2019-07-09 21:14 ` Jason Merrill
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).