+ GRAS_IN1("(%s)",name);
+ res = gras_datadesc_by_name(name);
+ if (res) {
+ gras_assert1(res->category_code == e_gras_datadesc_type_cat_ref,
+ "Redefinition of %s does not match",name);
+ gras_assert1(res->category.ref_data.type == referenced_type,
+ "Redefinition of %s does not match",name);
+ gras_assert1(res->category.ref_data.selector == NULL,
+ "Redefinition of %s does not match",name);
+ VERB1("Discarding redefinition of %s",name);
+ *dst=res;
+ return no_error;
+ }
+
+ TRY(gras_ddt_new(name,dst));
+ res=*dst;
+
+ gras_assert0(pointer_type, "Cannot get the description of data pointer");
+
+ for (arch=0; arch<gras_arch_count; arch ++){
+ res->size[arch] = pointer_type->size[arch];
+ res->alignment[arch] = pointer_type->alignment[arch];
+ res->aligned_size[arch] = pointer_type->aligned_size[arch];
+ }
+
+ res->category_code = e_gras_datadesc_type_cat_ref;
+ res->category.ref_data.type = referenced_type;
+ res->category.ref_data.selector = NULL;
+
+ return no_error;
+}
+/**
+ * gras_datadesc_ref_generic:
+ *
+ * Create a new ref to a type given at use time, and give a pointer to it
+ */
+gras_error_t
+gras_datadesc_ref_generic(const char *name,
+ gras_datadesc_selector_t selector,
+ gras_datadesc_type_t **dst) {
+
+ gras_error_t errcode;
+ gras_datadesc_type_t *res;
+ gras_datadesc_type_t *pointer_type = gras_datadesc_by_name("data pointer");
+ int arch;