[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [creduce-dev] unifdef



Thanks Yaron. If I understand correctly, the test oracle is that GCC is happy with the program and Clang is not?

I just pushed a change adding your include-remover pass, thanks for contributing it.

John


On 10/31/15 10:54 PM, Yaron Keren wrote:
Sure, here is an example that comes with Boost::graph 1.59. Clang
compiles this cleanly as provided but if you add one include at the
first line you'll get mysterious template errors starting with:

 >clang++ -std=c++11 -fsyntax-only incremental_components.cpp
In file included from incremental_components.cpp:17:
In file included from boost/graph/incremental_components.hpp:20:
In file included from boost/pending/disjoint_sets.hpp:16:
boost/pending/detail/disjoint_sets.hpp:59:7: error: no matching function
for call to 'get'
   if (get(rank, i) > get(rank, j))
       ^~~

Moving the include after all other includes compiles OK again.
OTOH, g++ 4.9.3 accepts this code with the include in *either* location.
If creduce can handle such code automatically it would be really great
as manually+creducing such examples is no fun.
I'd like to see the final result...


2015-10-31 22:17 GMT+02:00 John Regehr <regehr@cs.utah.edu
<mailto:regehr@cs.utah.edu>>:

    Yaron, thanks for sharing!  I think you are describing a more
    difficult reduction than any I have attempted.

        First, every interestingness test was slow to compile, about 10s.


    Ouch.

        Second, Boost-using code and Boost-headers usually include many more
        includes than actually required for a specific example. We are
        talking
        about very large preprocessed files. Preprocessing the Boost::log
        example sinks_async.cpp results in 8.7MB file on my system. Once
        preprocessed they are not quickly reduced and it's much more
        efficient
        to  reduce one #include line rather than reducing the resulting huge
        preprocessed code - which may not be needed at all.


    Ok, this makes sense.

        Finally, the Boost usage of templates, inheritance and macros (with
        non-preprocessed code) is very (too?) complex to automatically
        reduce
        and required manual help anyhow. Helping the reduce process is
        feasible
        only while the source is still human-readable and small.


    Got it.

        With the Boost::log example I used creduce mostly for deleting the
        includes, most of them were *not* required at every include
        depth, then
        manually copying the remaining include files text into the main
        include,
        in part or in whole (judgement call). It took about a day work
        to reduce
        this example.


    Well that isn't very much fun.  It would be nice for C-Reduce to be
    able to automate more of this-- can you point me at some test
    cases?  I can probably make some time to work on this.

    John