Commit 742b6dc4 by Paolo Carlini Committed by Paolo Carlini

decl.c (grokdeclarator): Use typespec_loc in error messages about 'auto' and trailing return type.

/cp
2019-01-17  Paolo Carlini  <paolo.carlini@oracle.com>

	* decl.c (grokdeclarator): Use typespec_loc in error messages
	about 'auto' and trailing return type.

/testsuite
2019-01-17  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/cpp0x/auto52.C: Test locations too.
	* g++.dg/cpp0x/trailing2.C: Likewise.
	* g++.dg/cpp1y/auto-fn18.C: Likewise.
	* g++.dg/cpp1y/auto-fn25.C: Likewise.
	* g++.dg/cpp1y/auto-fn52.C: Likewise.
	* g++.dg/cpp1y/auto-fn53.C: Likewise.
	* g++.dg/cpp1y/auto-fn54.C: Likewise.

From-SVN: r268043
parent b9e03679
2019-01-17 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (grokdeclarator): Use typespec_loc in error messages
about 'auto' and trailing return type.
2019-01-17 David Malcolm <dmalcolm@redhat.com> 2019-01-17 David Malcolm <dmalcolm@redhat.com>
PR c++/88699 PR c++/88699
......
...@@ -11287,35 +11287,37 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -11287,35 +11287,37 @@ grokdeclarator (const cp_declarator *declarator,
/* OK for C++11 lambdas. */; /* OK for C++11 lambdas. */;
else if (cxx_dialect < cxx14) else if (cxx_dialect < cxx14)
{ {
error ("%qs function uses " error_at (typespec_loc, "%qs function uses "
"%<auto%> type specifier without trailing " "%<auto%> type specifier without "
"return type", name); "trailing return type", name);
inform (input_location, "deduced return type " inform (typespec_loc,
"only available with -std=c++14 or " "deduced return type only available "
"-std=gnu++14"); "with -std=c++14 or -std=gnu++14");
} }
else if (virtualp) else if (virtualp)
{ {
error ("virtual function cannot " error_at (typespec_loc, "virtual function "
"have deduced return type"); "cannot have deduced return type");
virtualp = false; virtualp = false;
} }
} }
else if (!is_auto (type) && sfk != sfk_conversion) else if (!is_auto (type) && sfk != sfk_conversion)
{ {
error ("%qs function with trailing return type has" error_at (typespec_loc, "%qs function with trailing "
" %qT as its type rather than plain %<auto%>", "return type has %qT as its type rather "
name, type); "than plain %<auto%>", name, type);
return error_mark_node; return error_mark_node;
} }
else if (is_auto (type) && AUTO_IS_DECLTYPE (type)) else if (is_auto (type) && AUTO_IS_DECLTYPE (type))
{ {
if (funcdecl_p) if (funcdecl_p)
error ("%qs function with trailing return type has " error_at (typespec_loc,
"%<decltype(auto)%> as its type rather than " "%qs function with trailing return type "
"plain %<auto%>", name); "has %<decltype(auto)%> as its type "
"rather than plain %<auto%>", name);
else else
error ("invalid use of %<decltype(auto)%>"); error_at (typespec_loc,
"invalid use of %<decltype(auto)%>");
return error_mark_node; return error_mark_node;
} }
tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node); tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node);
...@@ -11359,11 +11361,13 @@ grokdeclarator (const cp_declarator *declarator, ...@@ -11359,11 +11361,13 @@ grokdeclarator (const cp_declarator *declarator,
if (cxx_dialect < cxx11) if (cxx_dialect < cxx11)
/* Not using maybe_warn_cpp0x because this should /* Not using maybe_warn_cpp0x because this should
always be an error. */ always be an error. */
error ("trailing return type only available with " error_at (typespec_loc,
"-std=c++11 or -std=gnu++11"); "trailing return type only available "
"with -std=c++11 or -std=gnu++11");
else else
error ("%qs function with trailing return type not " error_at (typespec_loc, "%qs function with trailing "
"declared with %<auto%> type specifier", name); "return type not declared with %<auto%> "
"type specifier", name);
return error_mark_node; return error_mark_node;
} }
} }
......
2019-01-17 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/cpp0x/auto52.C: Test locations too.
* g++.dg/cpp0x/trailing2.C: Likewise.
* g++.dg/cpp1y/auto-fn18.C: Likewise.
* g++.dg/cpp1y/auto-fn25.C: Likewise.
* g++.dg/cpp1y/auto-fn52.C: Likewise.
* g++.dg/cpp1y/auto-fn53.C: Likewise.
* g++.dg/cpp1y/auto-fn54.C: Likewise.
2019-01-17 David Malcolm <dmalcolm@redhat.com> 2019-01-17 David Malcolm <dmalcolm@redhat.com>
PR c++/88699 PR c++/88699
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
// { dg-do compile { target c++11 } } // { dg-do compile { target c++11 } }
using T = auto() -> int; using T = auto() -> int;
using U = void() -> int; // { dg-error "function with trailing return type not declared with .auto." } using U = void() -> int; // { dg-error "11:.type name. function with trailing return type not declared with .auto." }
using W = auto(); // { dg-error "invalid use of .auto." } using W = auto(); // { dg-error "11:invalid use of .auto." }
...@@ -3,14 +3,14 @@ ...@@ -3,14 +3,14 @@
// { dg-do compile { target c++11 } } // { dg-do compile { target c++11 } }
auto f1 () -> int; auto f1 () -> int;
auto f2 (); // { dg-error "without trailing return type" "" { target { ! c++14 } } } auto f2 (); // { dg-error "1:.f2. function uses .auto. type specifier without trailing return type" "" { target { ! c++14 } } }
int f3 () -> int; // { dg-error "trailing return type" } int f3 () -> int; // { dg-error "1:.f3. function with trailing return type" }
auto *f4 () -> int; // { dg-error "trailing return type" } auto *f4 () -> int; // { dg-error "1:.f4. function with trailing return type" }
struct A struct A
{ {
auto f5 () const -> int; auto f5 () const -> int;
auto f6 (); // { dg-error "without trailing return type" "" { target { ! c++14 } } } auto f6 (); // { dg-error "3:.f6. function uses .auto. type specifier without trailing return type" "" { target { ! c++14 } } }
int f7 () -> int; // { dg-error "trailing return type" } int f7 () -> int; // { dg-error "3:.f7. function with trailing return type" }
auto *f8 () -> int; // { dg-error "trailing return type" } auto *f8 () -> int; // { dg-error "3:.f8. function with trailing return type" }
}; };
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
struct A struct A
{ {
virtual int f() { return 1; } // { dg-message "overridden" } virtual int f() { return 1; } // { dg-message "overridden" }
virtual auto g() { return 1; } // { dg-error "virtual" } virtual auto g() { return 1; } // { dg-error "11:virtual" }
}; };
struct B: A struct B: A
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
struct A struct A
{ {
virtual auto foo() {} // { dg-error "virtual.*deduced" } virtual auto foo() {} // { dg-error "11:virtual.*deduced" }
}; };
struct B : A struct B : A
......
// PR c++/67012 // PR c++/67012
// { dg-do compile { target c++14 } } // { dg-do compile { target c++14 } }
decltype(auto) f() -> int; // { dg-error "function with trailing return type has" } decltype(auto) f() -> int; // { dg-error "1:.f. function with trailing return type has" }
// PR c++/86942 // PR c++/86942
// { dg-do compile { target c++14 } } // { dg-do compile { target c++14 } }
using T = decltype(auto) () -> int; // { dg-error "invalid use of" } using T = decltype(auto) () -> int; // { dg-error "11:invalid use of" }
// { dg-do compile { target c++14 } } // { dg-do compile { target c++14 } }
using T = int () -> decltype(auto); // { dg-error "function with trailing return type not declared with .auto." } using T = int () -> decltype(auto); // { dg-error "11:.type name. function with trailing return type not declared with .auto." }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment