Commit 19cec0db1e

LemonBoy <thatlemon@gmail.com>
2021-04-25 16:49:21
std: Make met.alignment work on more types
Make it return the correct value for function types and optional pointers.
1 parent 50a8124
Changed files (1)
lib
lib/std/meta.zig
@@ -117,10 +117,21 @@ test "std.meta.bitCount" {
     testing.expect(bitCount(f32) == 32);
 }
 
+/// Returns the alignment of type T.
+/// Note that if T is a pointer or function type the result is different than
+/// the one returned by @alignOf(T).
+/// If T is a pointer type the alignment of the type it points to is returned.
+/// If T is a function type the alignment a target-dependent value is returned.
 pub fn alignment(comptime T: type) comptime_int {
-    //@alignOf works on non-pointer types
-    const P = if (comptime trait.is(.Pointer)(T)) T else *T;
-    return @typeInfo(P).Pointer.alignment;
+    return switch (@typeInfo(T)) {
+        .Optional => |info| switch (@typeInfo(info.child)) {
+            .Pointer, .Fn => alignment(info.child),
+            else => @alignOf(T),
+        },
+        .Pointer => |info| info.alignment,
+        .Fn => |info| info.alignment,
+        else => @alignOf(T),
+    };
 }
 
 test "std.meta.alignment" {
@@ -129,6 +140,8 @@ test "std.meta.alignment" {
     testing.expect(alignment(*align(2) u8) == 2);
     testing.expect(alignment([]align(1) u8) == 1);
     testing.expect(alignment([]align(2) u8) == 2);
+    testing.expect(alignment(fn () void) > 0);
+    testing.expect(alignment(fn () align(128) void) == 128);
 }
 
 pub fn Child(comptime T: type) type {