brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · cc509f7 Raw
73 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s2 3void f() {4  typedef int T;5  int x, *px;6  7  // Type id.8  (T())x;    // expected-error {{cast from 'int' to 'T ()'}}9  (T())+x;   // expected-error {{cast from 'int' to 'T ()'}}10  (T())*px;  // expected-error {{cast from 'int' to 'T ()'}}11  12  // Expression.13  x = (T());14  x = (T())/x;15 16  typedef int *PT;17  // Make sure stuff inside the parens are parsed only once (only one warning).18  x = (PT()[(int){1}]); // expected-warning {{compound literals}}19 20  // Special case: empty parens is a call, not an expression21  struct S{int operator()();};22  (S())();23 24  // Special case: "++" is postfix here, not prefix25  (S())++; // expected-error {{cannot increment value of type 'S'}}26 27  struct X { int &operator++(int); X operator[](int); int &operator++(); };28  int &postfix_incr = (X()[3])++;29  (X())++ ++; // ok, not a C-style cast30  (X())++ ++X(); // expected-error {{C-style cast from 'int' to 'X ()'}}31  int q = (int)++(x);32}33 34// Make sure we do tentative parsing correctly in conditions.35typedef int type;36struct rec { rec(int); };37 38namespace ns {39  typedef int type;40  struct rec { rec(int); };41}42 43struct cls {44  typedef int type;45  struct rec { rec(int); };46};47 48struct result {49  template <class T> result(T);50  bool check();51};52 53void test(int i) {54  if (result((cls::type) i).check())55    return;56 57  if (result((ns::type) i).check())58    return;59 60  if (result((::type) i).check())61    return;62 63  if (result((cls::rec) i).check())64    return;65 66  if (result((ns::rec) i).check())67    return;68 69  if (result((::rec) i).check())70    return;71}72 73