about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTicki <Ticki@users.noreply.github.com>2016-03-21 21:13:50 +0100
committerTicki <Ticki@users.noreply.github.com>2016-03-22 09:58:23 +0100
commit1f6b05e955f5e6972305c04cda1895107cca36f8 (patch)
tree5a300bd2d69fa086a47fdde57a0f2e63beb06461
parent1605ab377bc2c9be97df2cfbab00e011d526e316 (diff)
downloadrust-1f6b05e955f5e6972305c04cda1895107cca36f8.tar.gz
rust-1f6b05e955f5e6972305c04cda1895107cca36f8.zip
Add tests
-rw-r--r--src/libsyntax/feature_gate.rs2
-rw-r--r--src/test/codegen/naked-functions.rs69
2 files changed, 70 insertions, 1 deletions
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index ebd8db1b25c..698913be292 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -212,7 +212,7 @@ const KNOWN_FEATURES: &'static [(&'static str, &'static str, Option<u32>, Status
     // rust runtime internal
     ("unwind_attributes", "1.4.0", None, Active),
 
-	// allow the use of `#[naked]` on functions.
+    // allow the use of `#[naked]` on functions.
     ("naked_functions", "1.9.0", None, Active),
 
     // allow empty structs and enum variants with braces
diff --git a/src/test/codegen/naked-functions.rs b/src/test/codegen/naked-functions.rs
new file mode 100644
index 00000000000..0a600f4acad
--- /dev/null
+++ b/src/test/codegen/naked-functions.rs
@@ -0,0 +1,69 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// ignore-tidy-linelength
+
+// compile-flags: -C no-prepopulate-passes
+
+#![crate_type = "lib"]
+#![feature(naked_functions)]
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal void @naked_empty()
+#[no_mangle]
+#[naked]
+fn naked_empty() {
+    // CHECK: ret void
+}
+
+// CHECK: Function Attrs: naked uwtable
+#[no_mangle]
+#[naked]
+// CHECK-NEXT: define internal void @naked_with_args(i{{[0-9]+}})
+fn naked_with_args(a: isize) {
+    // CHECK: %a = alloca i{{[0-9]+}}
+    // CHECK: ret void
+}
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal i{{[0-9]+}} @naked_with_return()
+#[no_mangle]
+#[naked]
+fn naked_with_return() -> isize {
+    // CHECK: ret i{{[0-9]+}} 0
+    0
+}
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}})
+#[no_mangle]
+#[naked]
+fn naked_with_args_and_return(a: isize) -> isize {
+    // CHECK: %a = alloca i{{[0-9]+}}
+    // CHECK: ret i{{[0-9]+}} %{{[0-9]+}}
+    a
+}
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal void @naked_recursive()
+#[no_mangle]
+#[naked]
+fn naked_recursive() {
+    // CHECK: call void @naked_empty()
+    naked_empty();
+    // CHECK: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_return()
+    naked_with_args(
+        // CHECK: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}} %{{[0-9]+}})
+        naked_with_args_and_return(
+            // CHECK: call void @naked_with_args(i{{[0-9]+}} %{{[0-9]+}})
+            naked_with_return()
+        )
+    );
+}