diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-03-08 00:34:49 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-03-08 00:34:49 +0000 |
| commit | 33023662cbaebfda5005f0ac7c3a99554d18b2cc (patch) | |
| tree | dba56aa7648b230997d6375b6400931a8ca9fe77 /clang | |
| parent | 4f902c7eccd47cc3e1d0ceebca3025406a2e5fa7 (diff) | |
| download | bcm5719-llvm-33023662cbaebfda5005f0ac7c3a99554d18b2cc.tar.gz bcm5719-llvm-33023662cbaebfda5005f0ac7c3a99554d18b2cc.zip | |
Add accidentally forgotten testcase from r262881.
llvm-svn: 262882
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.fallthrough/p1.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.fallthrough/p1.cpp b/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.fallthrough/p1.cpp new file mode 100644 index 00000000000..e7c90339a21 --- /dev/null +++ b/clang/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; + } +} |

