[PATCH 1/2] Test and support all cpp operator types
sami wagiaalla
swagiaal@redhat.com
Tue May 18 20:49:00 GMT 2010
> Sami> @@ -800,21 +800,27 @@ make_symbol_overload_list_using (const char *func_name,
> Sami> const char *namespace)
> [...]
> Sami> - for (current = block_using (get_selected_block (0));
> Sami> - current != NULL;
> Sami> - current = current->next)
> Sami> - {
> Sami> - if (strcmp (namespace, current->import_dest) == 0)
> Sami> - {
> Sami> - make_symbol_overload_list_using (func_name,
> Sami> - current->import_src);
> Sami> - }
> Sami> - }
> Sami> + for (block = get_selected_block (0);
> Sami> + block != NULL;
> Sami> + block = BLOCK_SUPERBLOCK(block))
> Sami> + for (current = block_using (block);
> Sami> + current != NULL;
> Sami> + current = current->next)
> Sami> + {
> [...]
>
> This part seems a little weird to me.
> make_symbol_overload_list_using calls make_symbol_overload_list_namespace,
> which calls make_symbol_overload_list_qualified, which itself
> starts with get_selected_block and iterates over the superblocks.
>
> It seems to me that only one such iteration should be needed.
> I don't have a test case but it seems like this could cause incorrect
> results in some corner case.
>
It is weird but it is due to the nature of the symbol tables. The first
iteration, by make_symbol_overload_list_using, is iteration over the
blocks' import statements. The Second iteration is actually searching
for the symbol.
If we assume that names belonging to namespaces can only be in the
static scope -since namespace symbols are flattened to the nearest
parent- then we can separate the qualified and unqualified searches
and eliminate the nesting of the iterations.
Please see patch 2/2.
> Sami> +# some unary operators for good measure
> Sami> +# Cannot resolve function operator++ to any overloaded instance
> Sami> +gdb_test "p ++q" "= 30"
>
> It would be interesting to know if "q++" would call an overloaded
> postfix operator++. These have a hack in the C++ spec to differentiate
> them from prefix ++.
>
It does work. This is tested in userdef.exp.
> I'm also curious to know if "ADL avoidance" works properly when a
> qualified reference to "operator<whatever>" is used. I didn't see a
> test for that in this patch. (If there is already one in the test
> suite, then of course we don't need a new one...)
>
Yes it does. I have added a test case.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: operators.patch
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20100518/2aa83519/attachment.ksh>
More information about the Gdb-patches
mailing list