From a84dfe0729cdd12871c8f9f9842ab80eef228cbc Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Tue, 8 Mar 2016 00:34:49 +0000 Subject: [PATCH] Add accidentally forgotten testcase from r262881. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262882 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../dcl.attr/dcl.attr.fallthrough/p1.cpp | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 test/CXX/dcl.dcl/dcl.attr/dcl.attr.fallthrough/p1.cpp diff --git a/test/CXX/dcl.dcl/dcl.attr/dcl.attr.fallthrough/p1.cpp b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.fallthrough/p1.cpp new file mode 100644 index 0000000000..e7c90339a2 --- /dev/null +++ b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.fallthrough/p1.cpp @@ -0,0 +1,70 @@ +// RUN: %clang_cc1 -std=c++1z -verify %s + +void f(int n) { + switch (n) { + case 0: + n += 1; + [[fallthrough]]; // ok + case 1: + if (n) { + [[fallthrough]]; // ok + } else { + return; + } + case 2: + for (int n = 0; n != 10; ++n) + [[fallthrough]]; // expected-error {{does not directly precede switch label}} + case 3: + while (true) + [[fallthrough]]; // expected-error {{does not directly precede switch label}} + case 4: + while (false) + [[fallthrough]]; // expected-error {{does not directly precede switch label}} + case 5: + do [[fallthrough]]; while (true); // expected-error {{does not directly precede switch label}} + case 6: + do [[fallthrough]]; while (false); // expected-error {{does not directly precede switch label}} + case 7: + switch (n) { + case 0: + // FIXME: This should be an error, even though the next thing we do is to + // fall through in an outer switch statement. + [[fallthrough]]; + } + case 8: + [[fallthrough]]; // expected-error {{does not directly precede switch label}} + goto label; + label: + case 9: + n += 1; + case 10: // no warning, -Wimplicit-fallthrough is not enabled in this test, and does not need to + // be enabled for these diagnostics to be produced. + break; + } +} + +[[fallthrough]] typedef int n; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} +typedef int [[fallthrough]] n; // expected-error {{'fallthrough' attribute cannot be applied to types}} +typedef int n [[fallthrough]]; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} + +enum [[fallthrough]] E {}; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} +class [[fallthrough]] C {}; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} + +[[fallthrough]] // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} +void g() { + [[fallthrough]] int n; // expected-error {{'fallthrough' attribute cannot be applied to a declaration}} + [[fallthrough]] ++n; // expected-error-re {{{{^}}fallthrough attribute is only allowed on empty statements}} + + switch (n) { + // FIXME: This should be an error. + [[fallthrough]]; + return; + + case 0: + [[fallthrough, fallthrough]]; // expected-error {{multiple times}} + case 1: + [[fallthrough(0)]]; // expected-error {{argument list}} + case 2: + break; + } +} -- 2.40.0