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 | |
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')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 42 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/concepts/decl-diagnose.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/main1.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/main2.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/main3.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend42.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend65.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/main-2.C | 4 |
10 files changed, 56 insertions, 22 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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1c06223..8009196 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +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. + 2018-06-20 Chung-Lin Tang <cltang@codesourcery.com> Thomas Schwinge <thomas@codesourcery.com> Cesar Philippidis <cesar@codesourcery.com> diff --git a/gcc/testsuite/g++.dg/concepts/decl-diagnose.C b/gcc/testsuite/g++.dg/concepts/decl-diagnose.C index fcbfc8f..caf6b2e 100644 --- a/gcc/testsuite/g++.dg/concepts/decl-diagnose.C +++ b/gcc/testsuite/g++.dg/concepts/decl-diagnose.C @@ -6,7 +6,7 @@ void f(concept int); // { dg-error "a parameter cannot be declared 'concept'" } template<typename T> concept int f2() { return 0; } // { dg-error "return type" } -concept bool f3(); // { dg-error "no definition" } +concept bool f3(); // { dg-error "14:concept .f3. has no definition" } struct X { diff --git a/gcc/testsuite/g++.dg/cpp0x/main1.C b/gcc/testsuite/g++.dg/cpp0x/main1.C new file mode 100644 index 0000000..4667c42 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/main1.C @@ -0,0 +1,3 @@ +// { dg-do compile { target c++11 } } + +constexpr int main(); // { dg-error "1:cannot declare .::main. to be .constexpr." } diff --git a/gcc/testsuite/g++.dg/other/main2.C b/gcc/testsuite/g++.dg/other/main2.C new file mode 100644 index 0000000..11fa09b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/main2.C @@ -0,0 +1 @@ +float main(); // { dg-error "1:.::main. must return .int." } diff --git a/gcc/testsuite/g++.dg/other/main3.C b/gcc/testsuite/g++.dg/other/main3.C new file mode 100644 index 0000000..febd6fd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/main3.C @@ -0,0 +1 @@ +inline int main(); // { dg-error "1:cannot declare .::main. to be inline" } diff --git a/gcc/testsuite/g++.dg/template/friend42.C b/gcc/testsuite/g++.dg/template/friend42.C index 73d10df..3b6ad5a 100644 --- a/gcc/testsuite/g++.dg/template/friend42.C +++ b/gcc/testsuite/g++.dg/template/friend42.C @@ -4,5 +4,5 @@ template <class T> void foo (int); template <class T> class Q { - friend void foo<T> (int = 3); // { dg-error "default argument" } + friend void foo<T> (int = 3); // { dg-error "27:default arguments are not allowed in declaration of friend" } }; diff --git a/gcc/testsuite/g++.dg/template/friend65.C b/gcc/testsuite/g++.dg/template/friend65.C new file mode 100644 index 0000000..8fa5654 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend65.C @@ -0,0 +1,6 @@ +template <class T> void foo (int); + +template <class T> +class Q { + friend inline void foo<T> (int); // { dg-error "10:.inline. is not allowed in declaration of friend" } +}; diff --git a/gcc/testsuite/g++.dg/warn/main-2.C b/gcc/testsuite/g++.dg/warn/main-2.C index d38ef8e..6a46ff9 100644 --- a/gcc/testsuite/g++.dg/warn/main-2.C +++ b/gcc/testsuite/g++.dg/warn/main-2.C @@ -7,8 +7,8 @@ void f1(); -void -main() /* { dg-error "must return" } */ +void /* { dg-error "1:.\:\:main. must return .int." } */ +main() { f1(); } |