1bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
2adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
3adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellvoid f() {
4adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  typedef int T;
5adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  int x, *px;
6adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
7adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  // Type id.
8adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  (T())x;    // expected-error {{cast from 'int' to 'T ()'}}
9adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  (T())+x;   // expected-error {{cast from 'int' to 'T ()'}}
10adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  (T())*px;  // expected-error {{cast from 'int' to 'T ()'}}
11adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
12adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  // Expression.
13adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  x = (T());
14adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  x = (T())/x;
15adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
16adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  typedef int *PT;
17adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  // Make sure stuff inside the parens are parsed only once (only one warning).
18adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  x = (PT()[(int){1}]); // expected-warning {{compound literals}}
19adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
20adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  // Special case: empty parens is a call, not an expression
21adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  struct S{int operator()();};
22adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  (S())();
23adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
24adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  // FIXME: Special case: "++" is postfix here, not prefix
25adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  // (S())++;
26adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
27adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
28adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell// Make sure we do tentative parsing correctly in conditions.
29adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwelltypedef int type;
30adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstruct rec { rec(int); };
31adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
32adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellnamespace ns {
33adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  typedef int type;
34adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  struct rec { rec(int); };
35adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell}
36adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
37adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstruct cls {
38e946688edac5cdf153652defae3ef732a3487416Ian Romanick  typedef int type;
39ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl  struct rec { rec(int); };
40ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl};
41adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
42adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwellstruct result {
43ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul  template <class T> result(T);
44ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul  bool check();
45ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul};
46adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
4798c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheideggervoid test(int i) {
48adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  if (result((cls::type) i).check())
49bf35d70635309e499aee666eb5811446aa8b489eRoland Scheidegger    return;
50bf35d70635309e499aee666eb5811446aa8b489eRoland Scheidegger
51bf35d70635309e499aee666eb5811446aa8b489eRoland Scheidegger  if (result((ns::type) i).check())
52bf35d70635309e499aee666eb5811446aa8b489eRoland Scheidegger    return;
534637235183b80963536f2364e4d50fcb894886ddDave Airlie
548cb16e6daff40bbfd7b63a43da72862226a4a164Dave Airlie  if (result((::type) i).check())
558cb16e6daff40bbfd7b63a43da72862226a4a164Dave Airlie    return;
56adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
57adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell  if (result((cls::rec) i).check())
58adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    return;
59adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell
604637235183b80963536f2364e4d50fcb894886ddDave Airlie  if (result((ns::rec) i).check())
61adbec39bbf671ad80f6c557801e274cac0d305faKeith Whitwell    return;
6298c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger
63122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul  if (result((::rec) i).check())
6498c791b543c4ba86b8bb54488bd872b33b10b1aaRoland Scheidegger    return;
65fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger}
66fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger
67fc606f7db9072d4f40081aea8f92f1d4489a5115Roland Scheidegger