|  | // 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; | 
|  | } | 
|  |  |