1 // RUN: %clang_cc1 -fsyntax-only -verify -Wconsumed -fcxx-exceptions -std=c++11 %s
3 // TODO: Switch to using macros for the expected warnings.
5 #define CALLABLE_WHEN(...) __attribute__ ((callable_when(__VA_ARGS__)))
6 #define CONSUMABLE(state) __attribute__ ((consumable(state)))
7 #define PARAM_TYPESTATE(state) __attribute__ ((param_typestate(state)))
8 #define RETURN_TYPESTATE(state) __attribute__ ((return_typestate(state)))
9 #define SET_TYPESTATE(state) __attribute__ ((set_typestate(state)))
10 #define TEST_TYPESTATE(state) __attribute__ ((test_typestate(state)))
12 typedef decltype(nullptr) nullptr_t;
15 class CONSUMABLE(unconsumed) ConsumableClass {
20 ConsumableClass(nullptr_t p) RETURN_TYPESTATE(consumed);
21 ConsumableClass(T val) RETURN_TYPESTATE(unconsumed);
22 ConsumableClass(ConsumableClass<T> &other);
23 ConsumableClass(ConsumableClass<T> &&other);
25 ConsumableClass<T>& operator=(ConsumableClass<T> &other);
26 ConsumableClass<T>& operator=(ConsumableClass<T> &&other);
27 ConsumableClass<T>& operator=(nullptr_t) SET_TYPESTATE(consumed);
30 ConsumableClass<T>& operator=(ConsumableClass<U> &other);
33 ConsumableClass<T>& operator=(ConsumableClass<U> &&other);
35 void operator()(int a) SET_TYPESTATE(consumed);
36 void operator*() const CALLABLE_WHEN("unconsumed");
37 void unconsumedCall() const CALLABLE_WHEN("unconsumed");
38 void callableWhenUnknown() const CALLABLE_WHEN("unconsumed", "unknown");
40 bool isValid() const TEST_TYPESTATE(unconsumed);
41 operator bool() const TEST_TYPESTATE(unconsumed);
42 bool operator!=(nullptr_t) const TEST_TYPESTATE(unconsumed);
43 bool operator==(nullptr_t) const TEST_TYPESTATE(consumed);
45 void constCall() const;
48 void consume() SET_TYPESTATE(consumed);
49 void unconsume() SET_TYPESTATE(unconsumed);
52 class CONSUMABLE(unconsumed) DestructorTester {
55 DestructorTester(int);
57 void operator*() CALLABLE_WHEN("unconsumed");
59 ~DestructorTester() CALLABLE_WHEN("consumed");
62 void baf0(const ConsumableClass<int> var);
63 void baf1(const ConsumableClass<int> &var);
64 void baf2(const ConsumableClass<int> *var);
66 void baf3(ConsumableClass<int> var);
67 void baf4(ConsumableClass<int> &var);
68 void baf5(ConsumableClass<int> *var);
69 void baf6(ConsumableClass<int> &&var);
71 ConsumableClass<int> returnsUnconsumed() {
72 return ConsumableClass<int>(); // expected-warning {{return value not in expected state; expected 'unconsumed', observed 'consumed'}}
75 ConsumableClass<int> returnsConsumed() RETURN_TYPESTATE(consumed);
76 ConsumableClass<int> returnsConsumed() {
77 return ConsumableClass<int>();
80 ConsumableClass<int> returnsUnknown() RETURN_TYPESTATE(unknown);
82 void testInitialization() {
83 ConsumableClass<int> var0;
84 ConsumableClass<int> var1 = ConsumableClass<int>();
85 ConsumableClass<int> var2(42);
86 ConsumableClass<int> var3(var2); // copy constructor
87 ConsumableClass<int> var4(var0); // copy consumed value
89 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
90 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
93 *var4; // expected-warning {{invalid invocation of method 'operator*' on object 'var4' while it is in the 'consumed' state}}
95 var0 = ConsumableClass<int>(42);
99 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
101 if (var0.isValid()) {
106 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
110 void testDestruction() {
111 DestructorTester D0(42), D1(42), D2;
115 *D2; // expected-warning {{invalid invocation of method 'operator*' on object 'D2' while it is in the 'consumed' state}}
117 D0.~DestructorTester(); // expected-warning {{invalid invocation of method '~DestructorTester' on object 'D0' while it is in the 'unconsumed' state}}
119 return; // expected-warning {{invalid invocation of method '~DestructorTester' on object 'D0' while it is in the 'unconsumed' state}} \
120 expected-warning {{invalid invocation of method '~DestructorTester' on object 'D1' while it is in the 'unconsumed' state}}
123 void testTempValue() {
124 *ConsumableClass<int>(); // expected-warning {{invalid invocation of method 'operator*' on a temporary object while it is in the 'consumed' state}}
127 void testSimpleRValueRefs() {
128 ConsumableClass<int> var0;
129 ConsumableClass<int> var1(42);
131 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
134 var0 = static_cast<ConsumableClass<int>&&>(var1);
137 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
141 ConsumableClass<int> var;
146 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
149 if (!var.isValid()) {
150 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
158 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
161 if (var != nullptr) {
164 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
167 if (var == nullptr) {
168 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
174 void testComplexConditionals0() {
175 ConsumableClass<int> var0, var1, var2;
182 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
183 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
191 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
192 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
200 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
201 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
205 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
206 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
213 if (!var0 && !var1) {
214 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
215 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
222 if (!var0 || !var1) {
223 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
224 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
231 if (!(var0 && var1)) {
232 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
233 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
240 if (!(var0 || var1)) {
241 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
242 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
249 if (var0 && var1 && var2) {
255 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
256 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
257 *var2; // expected-warning {{invalid invocation of method 'operator*' on object 'var2' while it is in the 'consumed' state}}
261 // FIXME: Get this test to pass.
262 if (var0 || var1 || var2) {
268 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
269 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
270 *var2; // expected-warning {{invalid invocation of method 'operator*' on object 'var2' while it is in the 'consumed' state}}
275 void testComplexConditionals1() {
276 ConsumableClass<int> var0, var1, var2;
278 // Coerce all variables into the unknown state.
288 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
289 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
293 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
294 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
297 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
298 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
303 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
306 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
307 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
311 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
312 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
315 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
319 if (!var0 && !var1) {
320 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
321 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
324 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
325 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
328 if (!(var0 || var1)) {
329 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
330 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
333 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
334 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
337 if (!var0 || !var1) {
338 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
339 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
346 if (!(var0 && var1)) {
347 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
348 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
355 if (var0 && var1 && var2) {
361 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
362 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
363 *var2; // expected-warning {{invalid invocation of method 'operator*' on object 'var2' while it is in the 'unknown' state}}
367 // FIXME: Get this test to pass.
368 if (var0 || var1 || var2) {
369 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'unknown' state}}
370 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'unknown' state}}
371 *var2; // expected-warning {{invalid invocation of method 'operator*' on object 'var2' while it is in the 'unknown' state}}
374 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
375 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
376 *var2; // expected-warning {{invalid invocation of method 'operator*' on object 'var2' while it is in the 'consumed' state}}
381 void testStateChangeInBranch() {
382 ConsumableClass<int> var;
384 // Make var enter the 'unknown' state.
388 var = ConsumableClass<int>(42);
394 void testFunctionParam(ConsumableClass<int> param) {
396 if (param.isValid()) {
403 *param; // expected-warning {{invocation of method 'operator*' on object 'param' while it is in the 'consumed' state}}
406 void testParamReturnTypestateCallee(bool cond, ConsumableClass<int> &Param RETURN_TYPESTATE(unconsumed)) { // expected-warning {{parameter 'Param' not in expected state when the function returns: expected 'unconsumed', observed 'consumed'}}
410 return; // expected-warning {{parameter 'Param' not in expected state when the function returns: expected 'unconsumed', observed 'consumed'}}
416 void testParamReturnTypestateCaller() {
417 ConsumableClass<int> var;
419 testParamReturnTypestateCallee(true, var);
424 void testParamTypestateCallee(ConsumableClass<int> Param0 PARAM_TYPESTATE(consumed),
425 ConsumableClass<int> &Param1 PARAM_TYPESTATE(consumed)) {
427 *Param0; // expected-warning {{invalid invocation of method 'operator*' on object 'Param0' while it is in the 'consumed' state}}
428 *Param1; // expected-warning {{invalid invocation of method 'operator*' on object 'Param1' while it is in the 'consumed' state}}
431 void testParamTypestateCaller() {
432 ConsumableClass<int> Var0, Var1(42);
434 testParamTypestateCallee(Var0, Var1); // expected-warning {{argument not in expected state; expected 'consumed', observed 'unconsumed'}}
438 void consumeFunc(ConsumableClass<int> P PARAM_TYPESTATE(unconsumed));
440 static void consumeFuncStatic(ConsumableClass<int> P PARAM_TYPESTATE(unconsumed));
441 void consumeFuncMeth(ConsumableClass<int> P PARAM_TYPESTATE(unconsumed));
442 void operator<<(ConsumableClass<int> P PARAM_TYPESTATE(unconsumed));
445 void operator>>(ParamTest& pt, ConsumableClass<int> P PARAM_TYPESTATE(unconsumed));
448 void testFunctionParams() {
449 // Make sure we handle the different kinds of functions.
450 ConsumableClass<int> P;
452 consumeFunc(P); // expected-warning {{argument not in expected state; expected 'unconsumed', observed 'consumed'}}
453 ParamTest::consumeFuncStatic(P); // expected-warning {{argument not in expected state; expected 'unconsumed', observed 'consumed'}}
455 pt.consumeFuncMeth(P); // expected-warning {{argument not in expected state; expected 'unconsumed', observed 'consumed'}}
456 pt << P; // expected-warning {{argument not in expected state; expected 'unconsumed', observed 'consumed'}}
457 pt >> P; // expected-warning {{argument not in expected state; expected 'unconsumed', observed 'consumed'}}
460 void baf3(ConsumableClass<int> var) {
464 void baf4(ConsumableClass<int> &var) {
465 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'unknown' state}}
468 void baf6(ConsumableClass<int> &&var) {
472 void testCallingConventions() {
473 ConsumableClass<int> var(42);
485 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'unknown' state}}
487 var = ConsumableClass<int>(42);
489 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'unknown' state}}
491 var = ConsumableClass<int>(42);
492 baf6(static_cast<ConsumableClass<int>&&>(var));
493 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
496 void testConstAndNonConstMemberFunctions() {
497 ConsumableClass<int> var(42);
506 void testFunctionParam0(ConsumableClass<int> param) {
510 void testFunctionParam1(ConsumableClass<int> ¶m) {
511 *param; // expected-warning {{invalid invocation of method 'operator*' on object 'param' while it is in the 'unknown' state}}
514 void testReturnStates() {
515 ConsumableClass<int> var;
517 var = returnsUnconsumed();
520 var = returnsConsumed();
521 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
524 void testCallableWhen() {
525 ConsumableClass<int> var(42);
531 var.callableWhenUnknown();
534 void testMoveAsignmentish() {
535 ConsumableClass<int> var0;
536 ConsumableClass<long> var1(42);
538 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
541 var0 = static_cast<ConsumableClass<long>&&>(var1);
544 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
546 var1 = ConsumableClass<long>(42);
548 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
551 void testConditionalMerge() {
552 ConsumableClass<int> var;
558 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
566 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
569 void testSetTypestate() {
570 ConsumableClass<int> var(42);
576 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
583 void testConsumes0() {
584 ConsumableClass<int> var(nullptr);
586 *var; // expected-warning {{invalid invocation of method 'operator*' on object 'var' while it is in the 'consumed' state}}
589 void testConsumes1() {
590 ConsumableClass<int> var(42);
592 var.unconsumedCall();
595 var.unconsumedCall(); // expected-warning {{invalid invocation of method 'unconsumedCall' on object 'var' while it is in the 'consumed' state}}
598 void testUnreachableBlock() {
599 ConsumableClass<int> var(42);
611 void testForLoop1() {
612 ConsumableClass<int> var0, var1(42);
614 for (int i = 0; i < 10; ++i) { // expected-warning {{state of variable 'var1' must match at the entry and exit of loop}}
615 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
619 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
622 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
625 void testWhileLoop1() {
628 ConsumableClass<int> var0, var1(42);
630 while (i-- > 0) { // expected-warning {{state of variable 'var1' must match at the entry and exit of loop}}
631 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
635 *var1; // expected-warning {{invalid invocation of method 'operator*' on object 'var1' while it is in the 'consumed' state}}
638 *var0; // expected-warning {{invalid invocation of method 'operator*' on object 'var0' while it is in the 'consumed' state}}
641 // Tests if state information is correctly discarded for certain shapes of CFGs.
642 void testSwitchGOTO(void) {
653 typedef const int*& IntegerPointerReference;
654 void testIsRValueRefishAndCanonicalType(IntegerPointerReference a) {}
656 namespace ContinueICETest {
678 virtual ~runtime_error();
683 if(sf) throw runtime_error();
687 } // end namespace ContinueICETest
690 namespace StatusUseCaseTests {
692 class CONSUMABLE(unconsumed)
693 __attribute__((consumable_auto_cast_state))
694 __attribute__((consumable_set_state_on_read))
701 Status() RETURN_TYPESTATE(consumed);
702 Status(int c) RETURN_TYPESTATE(unconsumed);
704 Status(const Status &other);
705 Status(Status &&other);
707 Status& operator=(const Status &other) CALLABLE_WHEN("unknown", "consumed");
708 Status& operator=(Status &&other) CALLABLE_WHEN("unknown", "consumed");
710 bool operator==(const Status &other) const SET_TYPESTATE(consumed);
712 bool check() const SET_TYPESTATE(consumed);
713 void ignore() const SET_TYPESTATE(consumed);
714 // Status& markAsChecked() { return *this; }
716 void clear() CALLABLE_WHEN("unknown", "consumed") SET_TYPESTATE(consumed);
718 ~Status() CALLABLE_WHEN("unknown", "consumed");
720 operator bool() const; // Will not consume the object.
725 Status doSomething();
726 void handleStatus(const Status& s RETURN_TYPESTATE(consumed));
727 void handleStatusRef(Status& s);
728 void handleStatusPtr(Status* s);
729 void handleStatusUnmarked(const Status& s);
731 void log(const char* msg);
732 void fail() __attribute__((noreturn));
733 void checkStat(const Status& s);
736 void testSimpleTemporaries0() {
737 doSomething(); // expected-warning {{invalid invocation of method '~Status' on a temporary object while it is in the 'unconsumed' state}}
740 void testSimpleTemporaries1() {
741 doSomething().ignore();
744 void testSimpleTemporaries2() {
745 handleStatus(doSomething());
748 void testSimpleTemporaries3() {
749 Status s = doSomething();
750 } // expected-warning {{invalid invocation of method '~Status' on object 's' while it is in the 'unconsumed' state}}
752 void testTemporariesWithControlFlow(bool a) {
753 bool b = false || doSomething(); // expected-warning {{invalid invocation of method '~Status' on a temporary object while it is in the 'unconsumed' state}}
756 Status testSimpleTemporariesReturn0() {
757 return doSomething();
760 Status testSimpleTemporariesReturn1() {
761 Status s = doSomething();
765 void testSimpleTemporaries4() {
766 Status s = doSomething();
770 void testSimpleTemporaries5() {
771 Status s = doSomething();
772 s.clear(); // expected-warning {{invalid invocation of method 'clear' on object 's' while it is in the 'unconsumed' state}}
775 void testSimpleTemporaries6() {
776 Status s1 = doSomething();
779 Status s2 = doSomething();
782 Status s3 = doSomething();
783 handleStatusPtr(&s3);
785 Status s4 = doSomething();
786 handleStatusUnmarked(s4);
789 void testSimpleTemporaries7() {
792 } // expected-warning {{invalid invocation of method '~Status' on object 's' while it is in the 'unconsumed' state}}
794 void testTemporariesWithConditionals0() {
797 Status s = doSomething();
800 } // expected-warning {{invalid invocation of method '~Status' on object 's' while it is in the 'unconsumed' state}}
802 void testTemporariesWithConditionals1() {
805 Status s = doSomething();
811 void testTemporariesWithConditionals2() {
814 Status s = doSomething();
820 void testTemporariesWithConditionals3() {
821 Status s = doSomething();
827 void testTemporariesAndConstructors0() {
828 Status s(doSomething()); // Test the copy constructor.
832 void testTemporariesAndConstructors1F() {
833 Status s1 = doSomething(); // Test the copy constructor.
835 } // expected-warning {{invalid invocation of method '~Status' on object 's2' while it is in the 'unconsumed' state}}
837 void testTemporariesAndConstructors1S() {
838 Status s1 = doSomething(); // Test the copy constructor.
843 void testTemporariesAndConstructors2F() {
844 // Test the move constructor.
845 Status s1 = doSomething();
846 Status s2 = static_cast<Status&&>(s1);
847 } // expected-warning {{invalid invocation of method '~Status' on object 's2' while it is in the 'unconsumed' state}}
849 void testTemporariesAndConstructors2S() {
850 // Test the move constructor.
851 Status s1 = doSomething();
852 Status s2 = static_cast<Status&&>(s1);
856 void testTemporariesAndOperators0F() {
857 // Test the assignment operator.
858 Status s1 = doSomething();
861 } // expected-warning {{invalid invocation of method '~Status' on object 's2' while it is in the 'unconsumed' state}}
863 void testTemporariesAndOperators0S() {
864 // Test the assignment operator.
865 Status s1 = doSomething();
871 void testTemporariesAndOperators1F() {
872 // Test the move assignment operator.
873 Status s1 = doSomething();
875 s2 = static_cast<Status&&>(s1);
876 } // expected-warning {{invalid invocation of method '~Status' on object 's2' while it is in the 'unconsumed' state}}
878 void testTemporariesAndOperators1S() {
879 // Test the move assignment operator.
880 Status s1 = doSomething();
882 s2 = static_cast<Status&&>(s1);
886 void testTemporariesAndOperators2() {
887 Status s1 = doSomething();
888 Status s2 = doSomething();
889 s1 = s2; // expected-warning {{invalid invocation of method 'operator=' on object 's1' while it is in the 'unconsumed' state}}
894 Status testReturnAutocast() {
895 Status s = doSomething();
896 s.check(); // consume s
897 return s; // should autocast back to unconsumed
901 namespace TestParens {
904 checkStat((doSomething()));
908 Status s = (doSomething());
913 (doSomething()).check();
917 if ((doSomething()) == Status::OK)
921 } // end namespace TestParens
923 } // end namespace InitializerAssertionFailTest
951 } // end namespace PR18260