67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.3 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())();
 | |
| 
 | |
|   // FIXME: Special case: "++" is postfix here, not prefix
 | |
|   // (S())++;
 | |
| }
 | |
| 
 | |
| // 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;
 | |
| }
 | |
| 
 | 
