Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Jan 2038 05:24:36 GMT
From:      rotel@indigo.ie
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   misc/6310: explicit cast needed in floatpoint.h for C++
Message-ID:  <203801010524.FAA05229@indigo.ie>

next in thread | raw e-mail | index | archive | help

>Number:         6310
>Category:       misc
>Synopsis:       explicit cast needed in floatpoint.h for C++
>Confidential:   yes
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Apr 15 09:10:02 PDT 1998
>Last-Modified:
>Originator:     Niall Smart
>Organization:
>Release:        FreeBSD 2.2.6-STABLE i386
>Environment:

>Description:

C++ does not allow implicit conversion from integer types to enum
types.  Although this behaviour usually "just" elicits a warning
from the compiler, it may in the future it cause compilation errors.

/usr/include/machine/floatingpoint.h defines the macro's fpgetround()
et al as calls to either __fpgetreg or __fpsetreg.  (which are defined
as inline functions if __GNUC__ is defined, there does not seem to
be any replacement for these functions when not using the GNU C
compiler)  Both of these functions return an int.

The supplied patch adds appropriate casts before the calls to
__fpgetreg and __fpgetreg.

Also, is anyone in a position to do something about the XXX at the
top of this header file?

/*-
 * XXX the following undocumented pollution is exported:
 *      fpsetsticky().
 *      FP*FLD, FP*OFF and FP*REG from <machine/ieeefp.h>
 */

>How-To-Repeat:

Compile this code with c++ -Wall:

#include <floatingpoint.h>

int main()
{
	fp_rnd_t        r;
	fp_prec_t	p;
	fp_except_t	e;
	
	r = fpgetround();
	r = fpsetround(r);
	
	p = fpgetprec();
	p = fpsetprec(p);
	
	e = fpgetmask();
	e = fpsetmask(e);

	e = fpgetsticky();
	e = fpresetsticky(e);
}

>Fix:

*** /usr/include/floatingpoint.h	Tue Oct 21 15:14:26 1997
--- floatingpoint.h	Fri Jan  1 05:22:59 2038
***************
*** 108,121 ****
  /*
   * SysV/386 FP control interface
   */
! #define fpgetround()	((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF)
! #define fpsetround(m)	__fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF)
! #define fpgetprec()	((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF)
! #define fpsetprec(m)	__fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF)
! #define fpgetmask()	((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF)
! #define fpsetmask(m)	__fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF)
! #define fpgetsticky()	((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF)
! #define fpresetsticky(m)	__fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF)
  #define fpsetsticky(m)	fpresetsticky(m)
  
  #endif /* !_FLOATINGPOINT_H_ */
--- 108,121 ----
  /*
   * SysV/386 FP control interface
   */
! #define fpgetround()	((fp_rnd_t) ((__fpgetreg(FP_RND_REG) & FP_RND_FLD) >> FP_RND_OFF))
! #define fpsetround(m)	((fp_rnd_t) __fpsetreg((m), FP_RND_REG, FP_RND_FLD, FP_RND_OFF))
! #define fpgetprec()	((fp_prec_t) ((__fpgetreg(FP_PRC_REG) & FP_PRC_FLD) >> FP_PRC_OFF))
! #define fpsetprec(m)	((fp_prec_t) __fpsetreg((m), FP_PRC_REG, FP_PRC_FLD, FP_PRC_OFF))
! #define fpgetmask()	((fp_except_t) ((~__fpgetreg(FP_MSKS_REG) & FP_MSKS_FLD) >> FP_MSKS_OFF))
! #define fpsetmask(m)	((fp_except_t) (__fpsetreg(~(m), FP_MSKS_REG, FP_MSKS_FLD, FP_MSKS_OFF)))
! #define fpgetsticky()	((fp_except_t) ((__fpgetreg(FP_STKY_REG) & FP_STKY_FLD) >> FP_STKY_OFF))
! #define fpresetsticky(m)	((fp_except_t) __fpsetreg(0, FP_STKY_REG, (m), FP_STKY_OFF))
  #define fpsetsticky(m)	fpresetsticky(m)
  
  #endif /* !_FLOATINGPOINT_H_ */
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?203801010524.FAA05229>