| // RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s | |
| void f() { | |
| typedef int T; | |
| int x, *px; | |
| // Type id. | |
| (T())x; // expected-error {{cast from 'int' to 'T ()'}} | |
| (T())+x; // expected-error {{cast from 'int' to 'T ()'}} | |
| (T())*px; // expected-error {{cast from 'int' to 'T ()'}} | |
| // Expression. | |
| x = (T()); | |
| x = (T())/x; | |
| typedef int *PT; | |
| // Make sure stuff inside the parens are parsed only once (only one warning). | |
| x = (PT()[(int){1}]); // expected-warning {{compound literals}} | |
| // Special case: empty parens is a call, not an expression | |
| struct S{int operator()();}; | |
| (S())(); | |
| // Special case: "++" is postfix here, not prefix | |
| (S())++; // expected-error {{cannot increment value of type 'S'}} | |
| struct X { int &operator++(int); X operator[](int); int &operator++(); }; | |
| int &postfix_incr = (X()[3])++; | |
| (X())++ ++; // ok, not a C-style cast | |
| (X())++ ++X(); // expected-error {{C-style cast from 'int' to 'X ()'}} | |
| int q = (int)++(x); | |
| } | |
| // Make sure we do tentative parsing correctly in conditions. | |
| typedef int type; | |
| struct rec { rec(int); }; | |
| namespace ns { | |
| typedef int type; | |
| struct rec { rec(int); }; | |
| } | |
| struct cls { | |
| typedef int type; | |
| struct rec { rec(int); }; | |
| }; | |
| struct result { | |
| template <class T> result(T); | |
| bool check(); | |
| }; | |
| void test(int i) { | |
| if (result((cls::type) i).check()) | |
| return; | |
| if (result((ns::type) i).check()) | |
| return; | |
| if (result((::type) i).check()) | |
| return; | |
| if (result((cls::rec) i).check()) | |
| return; | |
| if (result((ns::rec) i).check()) | |
| return; | |
| if (result((::rec) i).check()) | |
| return; | |
| } | |