[cfe-commits] Modulo renaming [WAS: r60615 ...]

Douglas Gregor dgregor at apple.com
Wed Dec 10 16:07:13 PST 2008


On Dec 11, 2008, at 12:30 AM, Gabor Greif wrote:

> Eli wrote:
>>> Doug wrote:
>>> With dependently-sized array types, we need them
>>> to be unique so that we can determine that the types of the arrays
>>> match in the parameter types of the functions "f" below:
>>>
>>>       template<int I, int J> void f(int (&array)[I+J]);
>>>       template<int X, int Y> void f(int (&array)[X+Y]) { ... }
>>>
>>> If we don't realize that those canonical types match, we'll think
>> that
>>> the definition is actually an overload rather than a redeclaration.
>>> Not good!
>>
>> Ouch, seems like a pain to implement.
>>
>> -Eli
>
> The metaprogramming community has solved this problem already,
> http://www.cl.cam.ac.uk/~amp12/freshml/ . They are also called nomes.
>
> If you have a system that is strong enough to know that (+) is
> commutative,
> then nominal unification should be able to prove the equivalence of
>
> template<int I, int J> void f(int (&array)[J+I]);
> template<int X, int Y> void f(int (&array)[X+Y]);

Thankfully,  determining that those two function templates are  
functionally equivalent but not equivalent (per C++ [temp.over.link] 
p7) is in the realm of "ill-formed, no diagnostic required." Of  
course, a "high quality implementation" would detect such errors...

> But, do we want a theorem prover in clang? ;-)

Patch welcome!

:)

	- Doug



More information about the cfe-commits mailing list