+(export 'check-method-return-type)
+(defun check-method-return-type (method-type wanted-type)
+ "Signal an error unless METHOD-TYPE does not return the WANTED-TYPE."
+ (let ((method-returns (c-type-subtype method-type)))
+ (unless (c-type-equal-p method-returns wanted-type)
+ (error "Method return type ~A should be ~A"
+ method-returns wanted-type))))
+
+(export 'check-method-return-type-against-message)
+(defun check-method-return-type-against-message (method-type message-type)
+ "Signal an error unless METHOD-TYPE and MESSAGE-TYPE return the same type."
+ (let ((message-returns (c-type-subtype message-type))
+ (method-returns (c-type-subtype method-type)))
+ (unless (c-type-equal-p message-returns method-returns)
+ (error "Method return type ~A doesn't match message ~A"
+ method-returns message-returns))))
+
+(export 'check-method-argument-lists)
+(defun check-method-argument-lists (method-type message-type)
+ "Signal an error unless METHOD-TYPE and MESSAGE-TYPE have matching argument
+ lists.
+
+ This checks that the two types have matching lists of arguments."
+ (unless (argument-lists-compatible-p (c-function-arguments message-type)
+ (c-function-arguments method-type))
+ (error "Method arguments ~A don't match message ~A"
+ method-type message-type)))
+