Use "diagnose_if" attribute for clang
Before this patch, clang shows many "division by zero is undefined" errors if a files has syntax error. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
fdd7f57b97
commit
4b2f2225e4
@ -2210,8 +2210,13 @@ ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mi
|
|||||||
|
|
||||||
# define rb_scan_args_isdigit(c) ((unsigned char)((c)-'0')<10)
|
# define rb_scan_args_isdigit(c) ((unsigned char)((c)-'0')<10)
|
||||||
|
|
||||||
# define rb_scan_args_count_end(fmt, ofs, varc, vari) \
|
# if defined(__has_attribute) && __has_attribute(diagnose_if)
|
||||||
((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
|
# define rb_scan_args_count_end(fmt, ofs, varc, vari) \
|
||||||
|
(fmt[ofs] ? rb_scan_args_bad_format(fmt) : (vari))
|
||||||
|
# else
|
||||||
|
# define rb_scan_args_count_end(fmt, ofs, varc, vari) \
|
||||||
|
((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
|
||||||
|
# endif
|
||||||
|
|
||||||
# define rb_scan_args_count_block(fmt, ofs, varc, vari) \
|
# define rb_scan_args_count_block(fmt, ofs, varc, vari) \
|
||||||
(fmt[ofs]!='&' ? \
|
(fmt[ofs]!='&' ? \
|
||||||
@ -2239,16 +2244,17 @@ ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mi
|
|||||||
rb_scan_args_count_var(fmt, ofs+1, varc, vari+fmt[ofs]-'0'))
|
rb_scan_args_count_var(fmt, ofs+1, varc, vari+fmt[ofs]-'0'))
|
||||||
|
|
||||||
# define rb_scan_args_count(fmt, varc) \
|
# define rb_scan_args_count(fmt, varc) \
|
||||||
((!rb_scan_args_isdigit(fmt[0]) ? \
|
(!rb_scan_args_isdigit(fmt[0]) ? \
|
||||||
rb_scan_args_count_var(fmt, 0, varc, 0) : \
|
rb_scan_args_count_var(fmt, 0, varc, 0) : \
|
||||||
rb_scan_args_count_opt(fmt, 1, varc, fmt[0]-'0')) \
|
rb_scan_args_count_opt(fmt, 1, varc, fmt[0]-'0'))
|
||||||
== (varc) || \
|
|
||||||
rb_scan_args_length_mismatch(fmt, varc))
|
|
||||||
|
|
||||||
# define rb_scan_args_verify_count(fmt, varc) \
|
# define rb_scan_args_verify_count(fmt, varc) \
|
||||||
((varc)/(rb_scan_args_count(fmt, varc)))
|
((varc)/(rb_scan_args_count(fmt, varc) == (varc) || \
|
||||||
|
rb_scan_args_length_mismatch(fmt, varc)))
|
||||||
|
|
||||||
# ifdef __GNUC__
|
# if defined(__has_attribute) && __has_attribute(diagnose_if)
|
||||||
|
# define rb_scan_args_verify(fmt, varc) 0
|
||||||
|
# elif defined(__GNUC__)
|
||||||
# define rb_scan_args_verify(fmt, varc) \
|
# define rb_scan_args_verify(fmt, varc) \
|
||||||
__extension__ ({ \
|
__extension__ ({ \
|
||||||
int verify; \
|
int verify; \
|
||||||
@ -2361,6 +2367,8 @@ rb_scan_args_end_idx(const char *fmt)
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
/* NOTE: Use `char *fmt` instead of `const char *fmt` because of clang's bug*/
|
||||||
|
/* https://bugs.llvm.org/show_bug.cgi?id=38095 */
|
||||||
# define rb_scan_args0(argc, argv, fmt, varc, vars) \
|
# define rb_scan_args0(argc, argv, fmt, varc, vars) \
|
||||||
rb_scan_args_set(argc, argv, \
|
rb_scan_args_set(argc, argv, \
|
||||||
rb_scan_args_n_lead(fmt), \
|
rb_scan_args_n_lead(fmt), \
|
||||||
@ -2369,17 +2377,22 @@ rb_scan_args_end_idx(const char *fmt)
|
|||||||
rb_scan_args_f_var(fmt), \
|
rb_scan_args_f_var(fmt), \
|
||||||
rb_scan_args_f_hash(fmt), \
|
rb_scan_args_f_hash(fmt), \
|
||||||
rb_scan_args_f_block(fmt), \
|
rb_scan_args_f_block(fmt), \
|
||||||
(rb_scan_args_verify(fmt, varc), vars))
|
(rb_scan_args_verify(fmt, varc), vars), (char *)fmt, varc)
|
||||||
ALWAYS_INLINE(static int
|
ALWAYS_INLINE(static int
|
||||||
rb_scan_args_set(int argc, const VALUE *argv,
|
rb_scan_args_set(int argc, const VALUE *argv,
|
||||||
int n_lead, int n_opt, int n_trail,
|
int n_lead, int n_opt, int n_trail,
|
||||||
int f_var, int f_hash, int f_block,
|
int f_var, int f_hash, int f_block,
|
||||||
VALUE *vars[]));
|
VALUE *vars[], char *fmt, int varc));
|
||||||
|
|
||||||
inline int
|
inline int
|
||||||
rb_scan_args_set(int argc, const VALUE *argv,
|
rb_scan_args_set(int argc, const VALUE *argv,
|
||||||
int n_lead, int n_opt, int n_trail,
|
int n_lead, int n_opt, int n_trail,
|
||||||
int f_var, int f_hash, int f_block,
|
int f_var, int f_hash, int f_block,
|
||||||
VALUE *vars[])
|
VALUE *vars[], RB_UNUSED_VAR(char *fmt), RB_UNUSED_VAR(int varc))
|
||||||
|
# if defined(__has_attribute) && __has_attribute(diagnose_if)
|
||||||
|
__attribute__((diagnose_if(rb_scan_args_count(fmt,varc)==0,"bad scan arg format","error")))
|
||||||
|
__attribute__((diagnose_if(rb_scan_args_count(fmt,varc)!=varc,"variable argument length doesn't match","error")))
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
int i, argi = 0, vari = 0, last_idx = -1;
|
int i, argi = 0, vari = 0, last_idx = -1;
|
||||||
VALUE *var, hash = Qnil, last_hash = 0;
|
VALUE *var, hash = Qnil, last_hash = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user