diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2018-06-20 19:07:37 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2018-06-20 19:07:37 +0000 |
commit | f2cb6e64c920bb2f4e8a1ce9cb300385b53349ed (patch) | |
tree | 889831642faaa4526b1397f33ff7336f063a13ad /gcc/cp | |
parent | 829c6349e96c5bfa8603aaef8858b38e237a2f33 (diff) | |
download | gcc-f2cb6e64c920bb2f4e8a1ce9cb300385b53349ed.zip gcc-f2cb6e64c920bb2f4e8a1ce9cb300385b53349ed.tar.gz gcc-f2cb6e64c920bb2f4e8a1ce9cb300385b53349ed.tar.bz2 |
decl.c (grokfndecl): Add const cp_decl_specifier_seq* parameter...
/cp
2018-06-20 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (grokfndecl): Add const cp_decl_specifier_seq* parameter;
tidy handling of a null location_t argument; use proper location
information in a few additional error messages.
(grokdeclarator): Update calls.
/testsuite
2018-06-20 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/template/friend65.C: New.
* g++.dg/cpp0x/main1.C: Likewise.
* g++.dg/other/main2.C: Likewise.
* g++.dg/other/main3.C: Likewise.
* g++.dg/template/friend42.C: Test location too.
* g++.dg/concepts/decl-diagnose.C: Likewise.
* g++.dg/warn/main-2.C: Update.
From-SVN: r261816
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 42 |
2 files changed, 31 insertions, 18 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 56cecfa..b567d60 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-06-20 Paolo Carlini <paolo.carlini@oracle.com> + + * decl.c (grokfndecl): Add const cp_decl_specifier_seq* parameter; + tidy handling of a null location_t argument; use proper location + information in a few additional error messages. + (grokdeclarator): Update calls. + 2018-06-20 Chung-Lin Tang <cltang@codesourcery.com> Thomas Schwinge <thomas@codesourcery.com> Cesar Philippidis <cesar@codesourcery.com> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index f12a01b..b763b25 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8588,6 +8588,7 @@ grokfndecl (tree ctype, tree declarator, tree parms, tree orig_declarator, + const cp_decl_specifier_seq *declspecs, tree decl_reqs, int virtualp, enum overload_flags flags, @@ -8611,19 +8612,22 @@ grokfndecl (tree ctype, int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE; tree t; + if (location == UNKNOWN_LOCATION) + location = input_location; + // Was the concept specifier present? bool concept_p = inlinep & 4; // Concept declarations must have a corresponding definition. if (concept_p && !funcdef_flag) { - error ("concept %qD has no definition", declarator); + error_at (location, "concept %qD has no definition", declarator); return NULL_TREE; } type = build_cp_fntype_variant (type, rqual, raises, late_return_type_p); - decl = build_lang_decl (FUNCTION_DECL, declarator, type); + decl = build_lang_decl_loc (location, FUNCTION_DECL, declarator, type); /* Set the constraints on the declaration. */ if (flag_concepts) @@ -8640,11 +8644,6 @@ grokfndecl (tree ctype, set_constraints (decl, ci); } - /* If we have an explicit location, use it, otherwise use whatever - build_lang_decl used (probably input_location). */ - if (location != UNKNOWN_LOCATION) - DECL_SOURCE_LOCATION (decl) = location; - if (TREE_CODE (type) == METHOD_TYPE) { tree parm = build_this_parm (decl, type, quals); @@ -8713,17 +8712,19 @@ grokfndecl (tree ctype, if (TREE_PURPOSE (t) && TREE_CODE (TREE_PURPOSE (t)) == DEFAULT_ARG) { - error ("default arguments are not allowed in declaration " - "of friend template specialization %qD", - decl); + error_at (defarg_location (TREE_PURPOSE (t)), + "default arguments are not allowed in declaration " + "of friend template specialization %qD", + decl); return NULL_TREE; } if (inlinep & 1) { - error ("%<inline%> is not allowed in declaration of friend " - "template specialization %qD", - decl); + error_at (declspecs->locations[ds_inline], + "%<inline%> is not allowed in declaration of friend " + "template specialization %qD", + decl); return NULL_TREE; } } @@ -8770,13 +8771,15 @@ grokfndecl (tree ctype, if (ctype == NULL_TREE && DECL_MAIN_P (decl)) { if (PROCESSING_REAL_TEMPLATE_DECL_P()) - error ("cannot declare %<::main%> to be a template"); + error_at (location, "cannot declare %<::main%> to be a template"); if (inlinep & 1) - error ("cannot declare %<::main%> to be inline"); + error_at (declspecs->locations[ds_inline], + "cannot declare %<::main%> to be inline"); if (inlinep & 2) - error ("cannot declare %<::main%> to be %<constexpr%>"); + error_at (declspecs->locations[ds_constexpr], + "cannot declare %<::main%> to be %<constexpr%>"); if (!publicp) - error ("cannot declare %<::main%> to be static"); + error_at (location, "cannot declare %<::main%> to be static"); inlinep = 0; publicp = 1; } @@ -8989,7 +8992,8 @@ grokfndecl (tree ctype, { tree oldtypeargs = TYPE_ARG_TYPES (TREE_TYPE (decl)); tree newtype; - error ("%<::main%> must return %<int%>"); + error_at (declspecs->locations[ds_type_spec], + "%<::main%> must return %<int%>"); newtype = build_function_type (integer_type_node, oldtypeargs); TREE_TYPE (decl) = newtype; } @@ -12145,6 +12149,7 @@ grokdeclarator (const cp_declarator *declarator, ? unqualified_id : dname, parms, unqualified_id, + declspecs, reqs, virtualp, flags, memfn_quals, rqual, raises, friendp ? -1 : 0, friendp, publicp, @@ -12389,6 +12394,7 @@ grokdeclarator (const cp_declarator *declarator, || storage_class != sc_static); decl = grokfndecl (ctype, type, original_name, parms, unqualified_id, + declspecs, reqs, virtualp, flags, memfn_quals, rqual, raises, 1, friendp, publicp, |