summaryrefslogtreecommitdiffstats
path: root/clang/test/Sema/asm-goto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Sema/asm-goto.cpp')
-rw-r--r--clang/test/Sema/asm-goto.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/clang/test/Sema/asm-goto.cpp b/clang/test/Sema/asm-goto.cpp
new file mode 100644
index 00000000000..f61a8096b83
--- /dev/null
+++ b/clang/test/Sema/asm-goto.cpp
@@ -0,0 +1,45 @@
+// RUN: %clang_cc1 %s -triple i386-pc-linux-gnu -verify -fsyntax-only
+
+struct NonTrivial {
+ ~NonTrivial();
+ int f(int);
+private:
+ int k;
+};
+void JumpDiagnostics(int n) {
+// expected-error@+1 {{cannot jump from this goto statement to its label}}
+ goto DirectJump;
+// expected-note@+1 {{jump bypasses variable with a non-trivial destructor}}
+ NonTrivial tnp1;
+
+DirectJump:
+// expected-error@+1 {{cannot jump from this asm goto statement to one of its possible targets}}
+ asm goto("jmp %l0;" ::::Later);
+// expected-note@+1 {{jump bypasses variable with a non-trivial destructor}}
+ NonTrivial tnp2;
+// expected-note@+1 {{possible target of asm goto statement}}
+Later:
+ return;
+}
+
+struct S { ~S(); };
+void foo(int a) {
+ if (a) {
+FOO:
+// expected-note@+2 {{jump exits scope of variable with non-trivial destructor}}
+// expected-note@+1 {{jump exits scope of variable with non-trivial destructor}}
+ S s;
+ void *p = &&BAR;
+// expected-error@+1 {{cannot jump from this asm goto statement to one of its possible targets}}
+ asm goto("jmp %l0;" ::::BAR);
+// expected-error@+1 {{cannot jump from this indirect goto statement to one of its possible targets}}
+ goto *p;
+ p = &&FOO;
+ goto *p;
+ return;
+ }
+// expected-note@+2 {{possible target of asm goto statement}}
+// expected-note@+1 {{possible target of indirect goto statement}}
+BAR:
+ return;
+}
OpenPOWER on IntegriCloud