Re: [RFC/PATCH] git-compat-util.h: Don't define NORETURN under __clang__

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ævar Arnfjörð Bjarmason venit, vidit, dixit 03.08.2010 15:08:
> clang version 1.0 on Debian testing x86_64 defines __GNUC__, but barfs
> on `void __attribute__((__noreturn__))'. E.g.:
> 
>     usage.c:56:1: error: function declared 'noreturn' should not return [-Winvalid-noreturn]
>     }
>     ^
>     1 diagnostic generated.
>     make: *** [usage.o] Error 1
> 
> There it's dying on `void __attribute__((__noreturn__)) usagef(const
> char *err, ...)' in usage.c, which doesn't return.
> 
> Change the header to define NORETURN to nothing under clang. This was
> the default behavior for non-GNU and non-MSC compilers already. Having
> NORETURN_PTR defined to the GNU C value has no effect on clang
> however.
> 
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
> ---
> 
> I have no experience with Clang so this may not be sane, but on my
> system clang compiles with it and passes all tests. It still spews a
> lot of warnings though:
>     
>     GITGUI_VERSION = 0.12.0.64.g89d61
>         * new build flags or prefix
>     config.c:297:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     connect.c:151:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     date.c:678:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     diff.c:429:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
> 
> These are valid, as control may not return the advertised type if we
> call die() inside them.
> 
>     log-tree.c:297:21: warning: field width should have type 'int', but argument has type 'unsigned int' [-Wformat]
>                              "Subject: [%s %0*d/%d] ",
>                                              ^
>     1 diagnostic generated.
>     notes.c:632:25: warning: field precision should have type 'int', but argument has type 'unsigned int' [-Wformat]
>             strbuf_addf(buf, "%o %.*s%c", mode, path_len, path, '\0');
>                                    ^            ~~~~~~~~
>     1 diagnostic generated.
> 
> Should these (and some below) just cast to (int) ?
> 
>     object.c:44:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     parse-options.c:155:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     read-cache.c:1361:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     remote.c:658:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     revision.c:253:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     setup.c:79:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     sideband.c:97:25: warning: field precision should have type 'int', but argument has type 'unsigned int' [-Wformat]
>                                             fprintf(stderr, "%.*s", brk + sf, b);
>                                                                ^    ~~~~~~~~
>     1 diagnostic generated.
>     transport.c:1133:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     imap-send.c:548:27: warning: more data arguments than '%' conversions [-Wformat-extra-args]
>                                cmd->tag, cmd->cmd, cmd->cb.dlen);
>                                                    ^
>     1 diagnostic generated.
>     Writing perl.mak for Git
>     GIT_VERSION = 1.7.2.1.7.gb44c1
>     builtin/blame.c:1984:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/bundle.c:67:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/commit.c:832:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/fetch-pack.c:209:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/grep.c:704:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/help.c:58:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/pack-redundant.c:584:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/push.c:252:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     builtin/reflog.c:782:1: warning: control may reach end of non-void function [-Wreturn-type]
>     }
>     ^
>     1 diagnostic generated.
>     
>  git-compat-util.h |    5 ++++-
>  1 files changed, 4 insertions(+), 1 deletions(-)
> 
> diff --git a/git-compat-util.h b/git-compat-util.h
> index 02a73ee..c651cb7 100644
> --- a/git-compat-util.h
> +++ b/git-compat-util.h
> @@ -183,7 +183,10 @@ extern char *gitbasename(char *);
>  #define is_dir_sep(c) ((c) == '/')
>  #endif
>  
> -#ifdef __GNUC__
> +#ifdef __clang__
> +#define NORETURN
> +#define NORETURN_PTR __attribute__((__noreturn__))
> +#elif __GNUC__

__GNUC__ should be true if defined, but maybe you still want

+#elif defined(__GNUC__)

instead to make this really equivalent in the GNUC case.

>  #define NORETURN __attribute__((__noreturn__))
>  #define NORETURN_PTR __attribute__((__noreturn__))
>  #elif defined(_MSC_VER)

Michael
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]