115 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 %s -std=c++11 -fcxx-exceptions -fexceptions -fsyntax-only -Wignored-qualifiers -verify
 | 
						|
 | 
						|
int test1() {
 | 
						|
  throw;
 | 
						|
}
 | 
						|
 | 
						|
// PR5071
 | 
						|
template<typename T> T f() { }
 | 
						|
 | 
						|
template<typename T>
 | 
						|
void g(T t) {
 | 
						|
  return t * 2; // okay
 | 
						|
}
 | 
						|
 | 
						|
template<typename T>
 | 
						|
T h() {
 | 
						|
  return 17;
 | 
						|
}
 | 
						|
 | 
						|
// Don't warn on cv-qualified class return types, only scalar return types.
 | 
						|
namespace ignored_quals {
 | 
						|
struct S {};
 | 
						|
const S class_c();
 | 
						|
const volatile S class_cv();
 | 
						|
 | 
						|
const int scalar_c(); // expected-warning{{'const' type qualifier on return type has no effect}}
 | 
						|
int const scalar_c2(); // expected-warning{{'const' type qualifier on return type has no effect}}
 | 
						|
 | 
						|
const
 | 
						|
char*
 | 
						|
const // expected-warning{{'const' type qualifier on return type has no effect}}
 | 
						|
f();
 | 
						|
 | 
						|
char
 | 
						|
const*
 | 
						|
const // expected-warning{{'const' type qualifier on return type has no effect}}
 | 
						|
g();
 | 
						|
 | 
						|
char* const h(); // expected-warning{{'const' type qualifier on return type has no effect}}
 | 
						|
char* volatile i(); // expected-warning{{'volatile' type qualifier on return type has no effect}}
 | 
						|
 | 
						|
char*
 | 
						|
volatile // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
 | 
						|
const
 | 
						|
j();
 | 
						|
 | 
						|
const volatile int scalar_cv(); // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
 | 
						|
 | 
						|
// FIXME: Maintain enough information that we can point the diagnostic at the 'volatile' keyword.
 | 
						|
const
 | 
						|
int S::*
 | 
						|
volatile
 | 
						|
mixed_ret(); // expected-warning {{'volatile' type qualifier on return type has no effect}}
 | 
						|
 | 
						|
const int volatile // expected-warning {{'const volatile' type qualifiers on return type have no effect}}
 | 
						|
    (((parens())));
 | 
						|
 | 
						|
_Atomic(int) atomic();
 | 
						|
 | 
						|
_Atomic // expected-warning {{'_Atomic' type qualifier on return type has no effect}}
 | 
						|
    int
 | 
						|
    atomic();
 | 
						|
 | 
						|
auto
 | 
						|
    trailing_return_type() -> // expected-warning {{'const' type qualifier on return type has no effect}}
 | 
						|
    const int;
 | 
						|
 | 
						|
const int ret_array()[4]; // expected-error {{cannot return array}}
 | 
						|
}
 | 
						|
 | 
						|
namespace PR9328 {
 | 
						|
  typedef char *PCHAR;
 | 
						|
  class Test 
 | 
						|
  {
 | 
						|
    const PCHAR GetName() { return 0; } // expected-warning{{'const' type qualifier on return type has no effect}}
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
class foo  {
 | 
						|
  operator const int ();
 | 
						|
  operator int * const ();
 | 
						|
};
 | 
						|
 | 
						|
namespace PR10057 {
 | 
						|
  struct S {
 | 
						|
    ~S();
 | 
						|
  };
 | 
						|
 | 
						|
  template <class VarType>
 | 
						|
  void Test(const VarType& value) {
 | 
						|
    return S() = value;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
namespace return_has_expr {
 | 
						|
  struct S {
 | 
						|
    S() {
 | 
						|
      return 42; // expected-error {{constructor 'S' should not return a value}}
 | 
						|
    }
 | 
						|
    ~S() {
 | 
						|
      return 42; // expected-error {{destructor '~S' should not return a value}}
 | 
						|
    }
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
// rdar://15366494
 | 
						|
// pr17759
 | 
						|
namespace ctor_returns_void {
 | 
						|
  void f() {}
 | 
						|
  struct S { 
 | 
						|
    S() { return f(); }; // expected-error {{constructor 'S' must not return void expression}}
 | 
						|
    ~S() { return f(); } // expected-error {{destructor '~S' must not return void expression}}
 | 
						|
  };
 | 
						|
}
 |