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
This commit is contained in:
parent
b9e0367980
commit
742b6dc476
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR c++/88699
|
||||
|
@ -11287,35 +11287,37 @@ grokdeclarator (const cp_declarator *declarator,
|
||||
/* OK for C++11 lambdas. */;
|
||||
else if (cxx_dialect < cxx14)
|
||||
{
|
||||
error ("%qs function uses "
|
||||
"%<auto%> type specifier without trailing "
|
||||
"return type", name);
|
||||
inform (input_location, "deduced return type "
|
||||
"only available with -std=c++14 or "
|
||||
"-std=gnu++14");
|
||||
error_at (typespec_loc, "%qs function uses "
|
||||
"%<auto%> type specifier without "
|
||||
"trailing return type", name);
|
||||
inform (typespec_loc,
|
||||
"deduced return type only available "
|
||||
"with -std=c++14 or -std=gnu++14");
|
||||
}
|
||||
else if (virtualp)
|
||||
{
|
||||
error ("virtual function cannot "
|
||||
"have deduced return type");
|
||||
error_at (typespec_loc, "virtual function "
|
||||
"cannot have deduced return type");
|
||||
virtualp = false;
|
||||
}
|
||||
}
|
||||
else if (!is_auto (type) && sfk != sfk_conversion)
|
||||
{
|
||||
error ("%qs function with trailing return type has"
|
||||
" %qT as its type rather than plain %<auto%>",
|
||||
name, type);
|
||||
error_at (typespec_loc, "%qs function with trailing "
|
||||
"return type has %qT as its type rather "
|
||||
"than plain %<auto%>", name, type);
|
||||
return error_mark_node;
|
||||
}
|
||||
else if (is_auto (type) && AUTO_IS_DECLTYPE (type))
|
||||
{
|
||||
if (funcdecl_p)
|
||||
error ("%qs function with trailing return type has "
|
||||
"%<decltype(auto)%> as its type rather than "
|
||||
"plain %<auto%>", name);
|
||||
error_at (typespec_loc,
|
||||
"%qs function with trailing return type "
|
||||
"has %<decltype(auto)%> as its type "
|
||||
"rather than plain %<auto%>", name);
|
||||
else
|
||||
error ("invalid use of %<decltype(auto)%>");
|
||||
error_at (typespec_loc,
|
||||
"invalid use of %<decltype(auto)%>");
|
||||
return error_mark_node;
|
||||
}
|
||||
tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node);
|
||||
@ -11359,11 +11361,13 @@ grokdeclarator (const cp_declarator *declarator,
|
||||
if (cxx_dialect < cxx11)
|
||||
/* Not using maybe_warn_cpp0x because this should
|
||||
always be an error. */
|
||||
error ("trailing return type only available with "
|
||||
"-std=c++11 or -std=gnu++11");
|
||||
error_at (typespec_loc,
|
||||
"trailing return type only available "
|
||||
"with -std=c++11 or -std=gnu++11");
|
||||
else
|
||||
error ("%qs function with trailing return type not "
|
||||
"declared with %<auto%> type specifier", name);
|
||||
error_at (typespec_loc, "%qs function with trailing "
|
||||
"return type not declared with %<auto%> "
|
||||
"type specifier", name);
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,13 @@
|
||||
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>
|
||||
|
||||
PR c++/88699
|
||||
|
@ -2,5 +2,5 @@
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
using T = auto() -> int;
|
||||
using U = void() -> int; // { dg-error "function with trailing return type not declared with .auto." }
|
||||
using W = auto(); // { dg-error "invalid use of .auto." }
|
||||
using U = void() -> int; // { dg-error "11:.type name. function with trailing return type not declared with .auto." }
|
||||
using W = auto(); // { dg-error "11:invalid use of .auto." }
|
||||
|
@ -3,14 +3,14 @@
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
auto f1 () -> int;
|
||||
auto f2 (); // { dg-error "without trailing return type" "" { target { ! c++14 } } }
|
||||
int f3 () -> int; // { dg-error "trailing return type" }
|
||||
auto *f4 () -> int; // { dg-error "trailing return type" }
|
||||
auto f2 (); // { dg-error "1:.f2. function uses .auto. type specifier without trailing return type" "" { target { ! c++14 } } }
|
||||
int f3 () -> int; // { dg-error "1:.f3. function with trailing return type" }
|
||||
auto *f4 () -> int; // { dg-error "1:.f4. function with trailing return type" }
|
||||
|
||||
struct A
|
||||
{
|
||||
auto f5 () const -> int;
|
||||
auto f6 (); // { dg-error "without trailing return type" "" { target { ! c++14 } } }
|
||||
int f7 () -> int; // { dg-error "trailing return type" }
|
||||
auto *f8 () -> int; // { dg-error "trailing return type" }
|
||||
auto f6 (); // { dg-error "3:.f6. function uses .auto. type specifier without trailing return type" "" { target { ! c++14 } } }
|
||||
int f7 () -> int; // { dg-error "3:.f7. function with trailing return type" }
|
||||
auto *f8 () -> int; // { dg-error "3:.f8. function with trailing return type" }
|
||||
};
|
||||
|
@ -3,7 +3,7 @@
|
||||
struct A
|
||||
{
|
||||
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
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
struct A
|
||||
{
|
||||
virtual auto foo() {} // { dg-error "virtual.*deduced" }
|
||||
virtual auto foo() {} // { dg-error "11:virtual.*deduced" }
|
||||
};
|
||||
|
||||
struct B : A
|
||||
|
@ -1,4 +1,4 @@
|
||||
// PR c++/67012
|
||||
// { 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" }
|
||||
|
@ -1,4 +1,4 @@
|
||||
// PR c++/86942
|
||||
// { 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" }
|
||||
|
@ -1,3 +1,3 @@
|
||||
// { 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." }
|
||||
|
Loading…
x
Reference in New Issue
Block a user