aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2018-06-20 19:07:37 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2018-06-20 19:07:37 +0000
commitf2cb6e64c920bb2f4e8a1ce9cb300385b53349ed (patch)
tree889831642faaa4526b1397f33ff7336f063a13ad /gcc/cp
parent829c6349e96c5bfa8603aaef8858b38e237a2f33 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/decl.c42
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,