diff --git a/loopy/kernel/array.py b/loopy/kernel/array.py
index ad6bacee28563080c180c28d590de4b216594dfa..e12bf77d5c00cbb591debf6c311a8ce1ac2c4dc2 100644
--- a/loopy/kernel/array.py
+++ b/loopy/kernel/array.py
@@ -184,6 +184,7 @@ def convert_computed_to_fixed_dim_tags(name, num_user_axes, num_target_axes,
     #
     # - target axes are implementation facing. Normal in-memory arrays have one.
     #   3D images have three.
+    import loopy as lp
 
     # {{{ pick apart arg dim tags into computed, fixed and vec
 
@@ -248,7 +249,7 @@ def convert_computed_to_fixed_dim_tags(name, num_user_axes, num_target_axes,
                 new_dim_tags[i] = FixedStrideArrayDimTag(stride_so_far,
                         target_axis=dim_tag.target_axis)
 
-                if shape is None:
+                if shape is None or shape is lp.auto:
                     # unable to normalize without known shape
                     return None
 
@@ -316,6 +317,8 @@ class ArrayBase(Record):
     # Note that order may also wind up in attributes, if the
     # number of dimensions has not yet been determined.
 
+    allowed_extra_kwargs = []
+
     def __init__(self, name, dtype=None, shape=None, dim_tags=None, offset=0,
             strides=None, order=None, **kwargs):
         """
@@ -385,6 +388,10 @@ class ArrayBase(Record):
               whether the passed arrays have offsets or not.
         """
 
+        for kwarg_name in kwargs:
+            if kwarg_name not in self.allowed_extra_kwargs:
+                raise TypeError("invalid kwarg: %s" % kwarg_name)
+
         import loopy as lp
 
         if dtype is not None and dtype is not lp.auto:
diff --git a/loopy/kernel/data.py b/loopy/kernel/data.py
index 60cba66f0eb808e281970f250096b5c94572a376..ee9b07bdb8e7167c741de099c3ebbe85da4a1247 100644
--- a/loopy/kernel/data.py
+++ b/loopy/kernel/data.py
@@ -236,6 +236,12 @@ class TemporaryVariable(ArrayBase):
     min_target_axes = 0
     max_target_axes = 1
 
+    allowed_extra_kwargs = [
+            "storage_shape",
+            "base_indices",
+            "is_local"
+            ]
+
     def __init__(self, name, dtype, shape, is_local,
             dim_tags=None, offset=0, strides=None, order=None,
             base_indices=None, storage_shape=None):