lib/sod.h (sod_sublassp): Fix function description.
[sod] / lib / sod.h
index dd1ee03..3ad4250 100644 (file)
--- a/lib/sod.h
+++ b/lib/sod.h
@@ -116,6 +116,19 @@ SOD__VARARGS_MACROS_PREAMBLE
 
 #define SOD__IGNORE(var) ((void)(var))
 
+/* --- @SOD__NORETURN@ --- *
+ *
+ * Use:                Marks functions which are not expected to return.
+ */
+
+#if SOD__GCC_P(2, 5)
+#  define SOD__NORETURN __attribute__((__noreturn__))
+#endif
+
+#ifndef SOD__NORETURN
+#  define SOD__NORETURN
+#endif
+
 /* --- @SOD__PARANOIA@ --- *
  *
  * Arguments:  @cond@ = a condition to check
@@ -307,7 +320,7 @@ struct sod_chain {
 
 /* --- @SOD_DECL@ --- *
  *
- * Arguments:  @cls@ = a class type name
+ * Arguments:  @cls_@ = a class type name
  *             @var@ = a variable name
  *             @keys@ = a @KWARGS(...)@ keyword argument sequence
  *
@@ -315,17 +328,36 @@ struct sod_chain {
  *             @cls@ with automatic lifetime.
  */
 
-#define SOD_DECL(cls, var, keys)                                       \
-  struct cls##__ilayout var##__layout;                                 \
-  cls *var = (cls *)sod_init(cls##__class, &var##__layout, keys)
+#define SOD_DECL(cls_, var, keys)                                      \
+  struct cls_##__ilayout var##__layout;                                        \
+  cls_ *var =                                                          \
+    SOD__PARANOIA(sizeof(var##__layout) == cls_##__class->cls.initsz,  \
+                 (cls_ *)sod_init(cls_##__class, &var##__layout, keys), \
+                 (sod__chksz_fail(cls_##__class, sizeof(var##__layout)), \
+                  (cls_ *)0))
 
 /*----- Functions provided ------------------------------------------------*/
 
+/* --- @sod__chksz_fail@ --- *
+ *
+ * Arguments:  @const SodClass *cls@ = class we were trying to instantiate
+ *             @size_t sz@ = size allocated
+ *
+ * Returns:    Doesn't.
+ *
+ * Use:                Reports instantiation failure caused by a mismatch between
+ *             the size allocated (@sz@) and the size required for an
+ *             instance of class @cls@.
+ */
+
+extern SOD__NORETURN
+  void sod__chksz_fail(const SodClass */*cls*/, size_t /*sz*/);
+
 /* --- @sod_subclassp@ --- *
  *
  * Arguments:  @const SodClass *sub, *super@ = pointers to two classes
  *
- * Returns:    Nonzero if @c@ is a subclass of @d@.
+ * Returns:    Nonzero if @sub@ is a subclass of @super@.
  */
 
 extern int sod_subclassp(const SodClass */*sub*/, const SodClass */*super*/);