forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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;
 | |
| }
 | |
| 
 |