| // PR c++/37962 |
| // Negative test for auto |
| // { dg-do compile { target c++11 } } |
| |
| #include <typeinfo> |
| #include <stdarg.h> |
| #include <stddef.h> |
| |
| int i = *(auto *) 0; // { dg-error "auto" } |
| struct A *p = (auto *) 0; // { dg-error "auto" } |
| int *q = static_cast <auto *>(0); // { dg-error "auto" } |
| const int *r = const_cast <auto *>(q); // { dg-error "auto" } |
| const std::type_info &t1 = typeid (auto); // { dg-error "auto" } |
| const std::type_info &t2 = typeid (auto *); // { dg-error "auto" } |
| |
| struct A |
| { |
| operator auto (); // { dg-error "auto" "" { target { ! c++14 } } } |
| operator auto *(); // { dg-error "auto" "" { target { ! c++14 } } } |
| }; |
| |
| struct A2 |
| { |
| operator auto () -> int; // { dg-error "invalid use of|trailing return type" } |
| operator auto*() -> int; // { dg-error "invalid use of|trailing return type|cannot be overloaded" } |
| }; |
| |
| template <typename> struct B |
| { |
| enum { e }; |
| }; |
| |
| template <typename T> struct C |
| { |
| C () : i () {} |
| int i; |
| }; |
| |
| bool d = (auto (A::*)()) 0; // { dg-error "auto" } |
| |
| void |
| foo () |
| { |
| __extension__ (auto) { 0 }; // { dg-error "auto" } |
| C<int> c; |
| dynamic_cast<auto> (c); // { dg-error "auto" } |
| reinterpret_cast<auto> (c); // { dg-error "auto" } |
| int i = auto (0); // { dg-error "auto" } |
| auto p1 = new (auto); // { dg-error "auto" } |
| auto p2 = new (auto) (42); // { dg-error "invalid use of|deduce" } |
| offsetof (auto, fld); // { dg-error "auto" } |
| offsetof (auto *, fld); // { dg-error "auto" } |
| sizeof (auto); // { dg-error "auto" } |
| sizeof (auto *); // { dg-error "auto" } |
| } |
| |
| void |
| foo2 (void) |
| { |
| __alignof__ (auto); // { dg-error "auto" } |
| __alignof__ (auto *); // { dg-error "auto" } |
| __typeof__ (auto) v1; // { dg-error "auto" } |
| __typeof__ (auto *) v2; // { dg-error "auto" } |
| __is_class (auto); // { dg-error "auto|expected" } |
| __is_pod (auto *); // { dg-error "auto|expected" } |
| __is_base_of (int, auto); // { dg-error "auto|expected" } |
| __is_base_of (auto, int); // { dg-error "auto|expected" } |
| __is_base_of (auto, auto *); // { dg-error "auto|expected" } |
| } |
| |
| B<auto> b; // { dg-error "auto|invalid" } |
| C<auto> c; // { dg-error "auto|invalid" } |
| C<auto *> c2; // { dg-error "auto|invalid" } |
| |
| enum : auto { EE = 0 }; // { dg-error "must be an integral type" } |
| enum struct D : auto * { FF = 0 }; // { dg-error "must be an integral type|declar|expected" } |
| |
| void |
| bar () |
| { |
| try { } catch (auto i) { } // { dg-error "18:parameter" } |
| try { } catch (auto) { } // { dg-error "18:parameter" } |
| try { } catch (auto *i) { } // { dg-error "18:parameter" } |
| try { } catch (auto *) { } // { dg-error "18:parameter" } |
| } |
| |
| void |
| baz (int i, ...) |
| { |
| va_list ap; |
| va_start (ap, i); |
| va_arg (ap, auto); // { dg-error "invalid use of" } |
| va_arg (ap, auto *); // { dg-error "invalid use of|expected" } |
| va_arg (ap, auto &); // { dg-error "invalid use of|expected" } |
| va_end (ap); |
| } |
| |
| template <typename T = auto> struct E {}; // { dg-error "invalid use of" } |
| template <class T = auto *> struct F {}; // { dg-error "invalid use of|expected" } |
| |
| auto fnlate () -> auto; // { dg-error "invalid use of" "" { target { ! c++14 } } } |
| auto fnlate2 () -> auto *; // { dg-error "invalid use of|expected" "" { target { ! c++14 } } } |
| |
| void |
| badthrow () throw (auto) // { dg-error "invalid use of" } |
| { // { dg-error "dynamic exception specification" "" { target c++17 } .-1 } |
| } // { dg-warning "deprecated" "" { target { ! c++17 } } .-2 } |
| |
| void |
| badthrow2 () throw (auto &) // { dg-error "invalid use of|expected" } |
| { // { dg-error "dynamic exception specification" "" { target c++17 } .-1 } |
| } // { dg-warning "deprecated" "" { target { ! c++17 } } .-2 } |
| |
| template <auto V = 4> struct G {}; // { dg-error "11:parameter" "" { target { ! c++17 } } } |
| |
| template <typename T> struct H { H (); ~H (); }; |
| H<auto> h; // { dg-error "invalid|initializer|not permitted in template argument" } |
| |
| void qq (auto); // { dg-error "auto" "" { target { ! concepts } } } |
| void qr (auto*); // { dg-error "auto" "" { target { ! concepts } } } |
| |
| // PR c++/46145 |
| typedef auto autot; // { dg-error "9:typedef declared .auto." } |