Comments (1)
If you run a debug build, the message is more explicit:
ambiguous call for N5yorel5yomm26methodI11YoMm2_S_sayFNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_8virtual_IRK9CharacterEEENS0_6policy23hash_factors_in_globalsEEE(7Warrior)
Aborted (core dumped)
Even better when piped into c++filt
:
ambiguous call for yorel::yomm2::method<YoMm2_S_say, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > (yorel::yomm2::virtual_<Character const&>), yorel::yomm2::policy::hash_factors_in_globals>(Warrior)
Or, using (undocumented) dev/yomm2filt
:
ambiguous call for method<say, basic_string<char, char_traits<char>, allocator<char> > (virtual_<Character const&>)>(Warrior)
Calls to missing or ambiguous definitions (your example is an extreme example of the latter) cannot be detected at compile-time, in general. That is because the definitions may be in different translation units. A language implementation could detect them at link time. YOMM2 detects them during update_methods
. If you run a debug build of the program with the (undocumented) YOMM2_TRACE
environment variable set to 1, you will get this output:
jll@euclid:~/dev/yomm2$ YOMM2_TRACE=1 /home/jll/dev/yomm2/build/tests/lab 2>&1 | dev/yomm2filt
Static class info:
0x55681c6adbd0 Character (Character(0x55681c6adbd0))
0x55681c6adc10 Warrior (Character(0x55681c6adbd0), Warrior(0x55681c6adc10))
0x55681c6adbe0 Dog (Character(0x55681c6adbd0), Dog(0x55681c6adbe0))
Inheritance:
Dog
bases: (Character)
derived: ()
covariant_classes: (Dog)
Warrior
bases: (Character)
derived: ()
covariant_classes: (Warrior)
Character
bases: ()
derived: (Dog, Warrior)
covariant_classes: (Warrior, Dog, Character)
Methods:
method<say, basic_string<char, char_traits<char>, allocator<char> > (virtual_<Character const&>)> (Character(0x55681c6adbd0))
(const Warrior& long long)
(const Warrior& long long)
(const Character& long long)
Layering classes...
Character
Dog Warrior
Allocating slots...
method<say, basic_string<char, char_traits<char>, allocator<char> > (virtual_<Character const&>)>#0: slot 0
Character Dog Warrior
Building dispatch table for method<say, basic_string<char, char_traits<char>, allocator<char> > (virtual_<Character const&>)>
make groups for param #0, class Character
specs applicable to Warrior
(const Character& long long)
(const Warrior& long long)
(const Warrior& long long)
-> mask: 111
specs applicable to Dog
(const Character& long long)
-> mask: 001
specs applicable to Character
(const Character& long long)
-> mask: 001
groups for dim 0:
group 0/0 mask 001
Dog(0x55681c6adbe0)
Character(0x55681c6adbd0)
group 0/1 mask 111
Warrior(0x55681c6adc10)
assigning specs
group 0/0 mask 001
Dog(0x55681c6adbe0)
Character(0x55681c6adbd0)
select best of:
(const Character& long long)
-> (const Character& long long) pf = 0x55681c66dcf0
group 0/1 mask 111
Warrior(0x55681c6adc10)
select best of:
(const Character& long long)
(const Warrior& long long)
(const Warrior& long long)
ambiguous
0 not implemented, 1 ambiguities, concrete only: 0, 0
assigning next
(const Character& long long):
for next, select best:
-> none
(const Warrior& long long):
for next, select best:
(const Character& long long)
-> (const Character& long long)
(const Warrior& long long):
for next, select best:
(const Character& long long)
-> (const Character& long long)
Finding hash factor for 3 ti*
trying with M = 2, 4 buckets
found 6814184542283810107 after 1 attempts and 0.018717 msecs
5 control table
9 mtbl for Dog: 0x55681c820dc8
10 mtbl for Warrior: 0x55681c820dd0
11 mtbl for Character: 0x55681c820e38
Initializing global vector at 0x55681c820de0
0 pointer to control table
1 hash table
5 control table
9 method<say, basic_string<char, char_traits<char>, allocator<char> > (virtual_<Character const&>)>
9 mtbl for Dog: 0x55681c820e28
10 mtbl for Warrior: 0x55681c820e30
11 mtbl for Character: 0x55681c820e38
12 end
Optimizing
method<say, basic_string<char, char_traits<char>, allocator<char> > (virtual_<Character const&>)>
Warrior mtbl[0] = 0x55681c66f8d0 (function)
Dog mtbl[0] = 0x55681c66dcf0 (function)
Character mtbl[0] = 0x55681c66dcf0 (function)
0 not implemented, 1 ambiguities, concrete only: 0, 0
Finished
ambiguous call for method<say, basic_string<char, char_traits<char>, allocator<char> > (virtual_<Character const&>)>(Warrior)
I plan to make this trace feature official soon (but not the exact output format).
Now why doesn't YOMM2 throw an exception, since it knows about the ambiguity? For two reasons: this is consistent with the behavior of C++ in similar situations; and because of dynamic loading. Not so much in your example, but, imagine a pair of ambiguous definitions - for example, add(diagonal_matrix&, matrix&)
and add(matrix&, diagonal_matrix&)
. The program may call update_methods()
, then, before trying to add two diagonal matrices, dynamically load a shared object that resolves the ambiguity by adding add(diagonal_matrix&, diagonal_matrix&)
, and calling update_methods()
again.
At some point I plan to expose the data structure corresponding to the trace. The programmer will then be able to throw if problems are detected.
from yomm2.
Related Issues (20)
- Boost 1.53 compatibility HOT 4
- Comma inside declare_method HOT 3
- Error when compiling with raw non-const ptr HOT 3
- Missing include HOT 1
- Issues with Debug build of depending library (due to recent changes) HOT 1
- excellent work! HOT 1
- Segfault during benchmark [v1.1.2] HOT 3
- Support for method templates (in declarations and in definitions). HOT 12
- Possibly missing include in header? HOT 3
- Dispatch table generation? HOT 7
- Dispatch on arbitrary values HOT 4
- specializing on `shared_ptr<Animal> const&` doesn't work for me. HOT 14
- Template support? HOT 2
- update_methods segfault if I forget a register_class HOT 12
- Boost always installs even though package exists on system
- Question: am I able to pass non-virtual parameter to method definition? HOT 1
- error in runtime destructor HOT 15
- Friendship with multi-methods HOT 19
- CMake warning related to policy CMP0048 HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from yomm2.