diff --git a/src/array.hpp b/src/array.hpp
index e223b14651d82f0ab0edaa2a84384e8fa1cca810..6d7e763874b86a6e459777d9e05e9231753b1a44 100644
--- a/src/array.hpp
+++ b/src/array.hpp
@@ -99,10 +99,7 @@ namespace detail
             }
 
     public:
-        fixed_base()
-            {
-                static_assert(Shape::fixed, "array shape must be compile-time fixed");
-            }
+        fixed_base() {}
 
         constexpr size_t dim(size_t i) const { return Shape::dim(i); }
         constexpr size_t stride(size_t i) const { return Shape::stride(i); }
@@ -140,8 +137,6 @@ namespace detail
         dynamic_base(const std::array<size_t, Shape::ndim> shape)
             : shape_(shape)
             {
-                static_assert(!Shape::fixed, "array shape must not be compile-time fixed");
-
                 for (size_t i = Shape::ndim; i > 0; --i) {
                     if (Shape::stride(i-1) != Dynamic)
                         strides_[i-1] = Shape::stride(i-1);
@@ -205,12 +200,14 @@ public:
     Array(Scalar *data, size_t size, const std::array<size_t, Shape::ndim> shape)
         : Base(shape), data_(data)
         {
+            static_assert(!Shape::fixed, "array shape must not be compile-time fixed");
             Base::data_bounds_check(size);
         }
 
     Array(Scalar *data, size_t size)
         : Base(), data_(data)
         {
+            static_assert(Shape::fixed, "array shape must be compile-time fixed");
             Base::data_bounds_check(size);
         }
 
diff --git a/src/main.cpp b/src/main.cpp
index 5ffac0bb1807b5c78df18e4de5e50b81eed6a2ef..fdd5ad9130ca1a9da23c9a8834dd82acd8928fb1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -24,8 +24,8 @@ void dump(Array<Scalar,Shape> Q)
 
 int main()
 {
-    std::vector<double> v(7*2*2*2);
-    Array<double,Shape<Dynamic,Dynamic,2,2> > Q0(v.data(), v.size(), {7,2,2,2});
+    std::vector<double> v(1*2*2*2);
+    Array<double,Shape<Dynamic,Dynamic,2,2> > Q0(v.data(), v.size(), {1,2,2,2});
     auto Q = Q0.part(0u,1u);
 
     S_2(Q);