1 // RUN: %clang_cc1 %s -std=c++11 -fcxx-exceptions -fexceptions -fsyntax-only -Wignored-qualifiers -verify 2 3 int test1() { 4 throw; 5 } 6 7 // PR5071 8 template<typename T> T f() { } 9 10 template<typename T> 11 void g(T t) { 12 return t * 2; // okay 13 } 14 15 template<typename T> 16 T h() { 17 return 17; 18 } 19 20 // Don't warn on cv-qualified class return types, only scalar return types. 21 namespace ignored_quals { 22 struct S {}; 23 const S class_c(); 24 const volatile S class_cv(); 25 26 const int scalar_c(); // expected-warning{{'const' type qualifier on return type has no effect}} 27 int const scalar_c2(); // expected-warning{{'const' type qualifier on return type has no effect}} 28 29 const 30 char* 31 const // expected-warning{{'const' type qualifier on return type has no effect}} 32 f(); 33 34 char 35 const* 36 const // expected-warning{{'const' type qualifier on return type has no effect}} 37 g(); 38 39 char* const h(); // expected-warning{{'const' type qualifier on return type has no effect}} 40 char* volatile i(); // expected-warning{{'volatile' type qualifier on return type has no effect}} 41 42 char* 43 volatile // expected-warning{{'const volatile' type qualifiers on return type have no effect}} 44 const 45 j(); 46 47 const volatile int scalar_cv(); // expected-warning{{'const volatile' type qualifiers on return type have no effect}} 48 49 // FIXME: Maintain enough information that we can point the diagnostic at the 'volatile' keyword. 50 const 51 int S::* 52 volatile 53 mixed_ret(); // expected-warning {{'volatile' type qualifier on return type has no effect}} 54 55 const int volatile // expected-warning {{'const volatile' type qualifiers on return type have no effect}} 56 (((parens()))); 57 58 _Atomic(int) atomic(); 59 60 _Atomic // expected-warning {{'_Atomic' type qualifier on return type has no effect}} 61 int 62 atomic(); 63 64 auto 65 trailing_return_type() -> // expected-warning {{'const' type qualifier on return type has no effect}} 66 const int; 67 68 const int ret_array()[4]; // expected-error {{cannot return array}} 69 } 70 71 namespace PR9328 { 72 typedef char *PCHAR; 73 class Test 74 { 75 const PCHAR GetName() { return 0; } // expected-warning{{'const' type qualifier on return type has no effect}} 76 }; 77 } 78 79 class foo { 80 operator const int (); 81 operator int * const (); 82 }; 83 84 namespace PR10057 { 85 struct S { 86 ~S(); 87 }; 88 89 template <class VarType> 90 void Test(const VarType& value) { 91 return S() = value; 92 } 93 } 94 95 namespace return_has_expr { 96 struct S { 97 S() { 98 return 42; // expected-error {{constructor 'S' should not return a value}} 99 } 100 ~S() { 101 return 42; // expected-error {{destructor '~S' should not return a value}} 102 } 103 }; 104 } 105 106 // rdar://15366494 107 // pr17759 108 namespace ctor_returns_void { 109 void f() {} 110 struct S { 111 S() { return f(); }; // expected-error {{constructor 'S' must not return void expression}} 112 ~S() { return f(); } // expected-error {{destructor '~S' must not return void expression}} 113 }; 114 } 115 116 void cxx_unresolved_expr() { 117 // The use of an undeclared variable tricks clang into building a 118 // CXXUnresolvedConstructExpr, and the missing ')' gives it an invalid source 119 // location for its rparen. Check that emitting a diag on the range of the 120 // expr doesn't assert. 121 return int(undeclared, 4; // expected-error {{expected ')'}} expected-note{{to match this '('}} expected-error {{void function 'cxx_unresolved_expr' should not return a value}} expected-error {{use of undeclared identifier 'undeclared'}} 122 } 123