/* { dg-do compile } */ /* { dg-options "-Os" } */ struct list_head { struct list_head *next; }; static inline __attribute__((always_inline)) void list_del_init(struct list_head *entry) { __list_del(entry->next); (entry)->next = (entry); }; struct dentry { void *d_fsdata; }; struct sysfs_dirent { struct list_head s_sibling; struct list_head s_children; }; const char *sysfs_get_name(struct sysfs_dirent *); void sysfs_hash_and_remove(struct dentry * dir, const char * name) { struct sysfs_dirent * sd; struct sysfs_dirent * parent_sd = dir->d_fsdata; for (sd = (struct sysfs_dirent *)((&parent_sd->s_children)->next); &sd->s_sibling != (&parent_sd->s_children); sd = (struct sysfs_dirent *)sd->s_sibling.next) { if (!__builtin_strcmp(sysfs_get_name(sd), name)) { list_del_init(&sd->s_sibling); break; } } }