integer icon indicating copy to clipboard operation
integer copied to clipboard

Ambiguity

Open skaller opened this issue 7 years ago • 1 comments

I'm getting an ambiguity with clang. This is actually on a fork I made to prepare for shared library visibility stuff:

 + /usr/bin/clang++ -c -std=c++14 -D_POSIX -w -fno-common -fvisibility=hidden 
-fno-strict-aliasing -fomit-frame-pointer -Ibuild/release/share/src/integer 
-DFLX_STATIC_LINK -Wfatal-errors -Wno-invalid-offsetof -Wno-parentheses -o build/release/obj/host/lib/rtl/flx_integer_static/build/release/share/src/integer/integer_static.o -MMD -MF /var/folders/km/g22y_d_j311d44xbkz5x4lww0000gn/T/tmp0tp6pja9/temp 
build/release/share/src/integer/integer.cpp
build/release/share/src/integer/integer.cpp:222:31: fatal error: conversion 
from 'const integer' to 'const integer::REP_SIZE_T' (aka 'const unsigned long')
 is ambiguous
    const integer::REP_SIZE_T max_bits = std::max(bits(), rhs.bits());
                              ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/release/share/src/integer/integer.include:159:9: note: candidate function
        operator bool()     const;
        ^
build/release/share/src/integer/integer.include:160:9: note: candidate function
        operator uint8_t()  const;
        ^
build/release/share/src/integer/integer.include:161:9: note: candidate function
        operator uint16_t() const;
        ^
build/release/share/src/integer/integer.include:162:9: note: candidate function
        operator uint32_t() const;
        ^
build/release/share/src/integer/integer.include:163:9: note: candidate function
        operator uint64_t() const;
        ^
build/release/share/src/integer/integer.include:164:9: note: candidate function
        operator int8_t()   const;
        ^
build/release/share/src/integer/integer.include:165:9: note: candidate function
        operator int16_t()  const;
        ^
build/release/share/src/integer/integer.include:166:9: note: candidate function
        operator int32_t()  const;
        ^
build/release/share/src/integer/integer.include:167:9: note: candidate function
        operator int64_t()  const;
        ^```

skaller avatar Sep 24 '18 01:09 skaller

BTW: I think that should be REP_SIZE_T. If I change it though I get this:

build/release/share/src/integer/integer.cpp:381:31:
fatal error: conversion from 'integer' to 
'std::__1::deque<unsigned char, std::__1::allocator<unsigned char> >::size_type'
 (aka 'unsigned long') is ambiguous
        out.insert(out.end(), whole - 1, 0);

The issue is:

    const integer & whole      = qr.first;             // number of zeros to add to the back

and that really does have to be an integer (because one could be shifting a lot of bits). Although I have no idea what would happen if you shifted more than uint64_t bits because the underlying array would then be larger than memory on a 64 bit machine .... So I guess a conversion from integer to REP_T is probably safe ..

skaller avatar Sep 24 '18 01:09 skaller