Hi!
Do you have any idea why the test "Bug598" fails? You seem to have
looked into it already.
- Olaf
On 08/31/2017 18:28, "Simon Schröder" wrote:
> Hi Olaf,
>
> Thanks! I did not really think about ag++ because the tests do not use it.
> However, ag++ -std=XXX should be sufficient for users (User-friendliness was
> the main reason why I found the ac++ "std" argument useful).
>
> Furthermore, thank you for fixing the ExecAdviceNewDelete test.
>
> This makes Bug598 the last failing test on Debian 9 and I am not sure whether
> the test will be fixed quickly. As a workaround puma.config can be generated
> using "ag++ -std=gnu++98 --gen_config".
>
> Reinhard, all in all, it should be sufficient for you to use the current trunk
> version and to add "-std=gnu++98" as ag++ command line argument when
> generating puma.config ("ag++ -std=gnu++98 --gen_config").
>
> Best regards,
>
> Simon
>
>
>> Hi Simon,
>>
>> I already suspected that I should think longer about this. ;-)
>>
>> I agree that the interface of ac++ for configuring the language standard
>> is not very convenient. However, it avoids redundancy. The __cplusplus
>> macro would have to be defined in puma.config anyway. Defining the
>> remaining parts of puma.config manually is either not convenient.
>>
>> If you use ag++, everything should work smoothly at the moment:
>> Depending on the gcc version and its default language standard, the
>> __cplusplus macro is defined in puma.config. If the project's source
>> code is written for some other standard, ag++ would be called with
>> -std=c++<year> and the __cplusplus macro would be generated accordingly.
>>
>> If we had a -std option in ac++, ag++ would have to be changed as well.
>>
>> In summary: I might be missing something, but still don't see the point
>> in that new option.
>>
>> - Olaf
>>
>>
>> On 08/31/2017 15:32, "Simon Schröder" wrote:
>>> Hi Olaf,
>>>
>>> Thank you for your opinion! I think my previous email was not clear enough.
>>> My
>>> suggestion was/is to have a *default* language standard that is independent
>>> of
>>> the operating system's default compiler. The language standard can still be
>>> changed to C++11, C++14, or C++17. Currently this change is possible by
>>> providing -D "__cplusplus=XXXXXXL" as a command line argument or through
>>> puma.config. What I do not like about this is that it is not documented (as
>>> far as I know) and that it is not as intuitive as a "std=..." command line
>>> argument. That is why I suggested adding that command line argument.
>>>
>>> Test Bug574 is fixed in current trunk version.
>>>
>>> Best regards,
>>>
>>> Simon
>>>
>>>
>>>
>>>> Hi!
>>>>
>>>> No. Please don't commit the fixes. I have implemented C++14 support in
>>>> ag++ and ac++ for good reasons. If ac++ is configured to internally use
>>>> the C++98 standard (always), it will not be able to handle programs that
>>>> make use of C++11/14/17 extensions. For instance, we wouldn't be able to
>>>> compile Qt 5.x applications anymore!
>>>>
>>>> If a test only works with a specific language standard, we can configure
>>>> that in its Makefile, e.g.:
>>>>
>>>> ACFLAGS ?= -D "__cplusplus=201103L"
>>>> CXXFLAGS ?= -std=c++11
>>>> include ../Makefile.generic
>>>>
>>>> However, normally the tests should work with C++98 *and* C++14, i.e.
>>>> older gccs und gcc >= 6. For the ExecAdviceNewDelete we should implement
>>>> different handling for the two cases in the weaver. However, first we
>>>> have to verify that the signature really changed. That would be quite
>>>> strange.
>>>>
>>>> tests/Bug574 should of course be fixed.
>>>>
>>>> Cheers,
>>>>
>>>> Olaf
>>>>
>>>> On 08/31/2017 14:23, "Simon Schröder" wrote:
>>>>> Hi Reinhard,
>>>>>
>>>>> I am able to reproduce the failing tests. The source of the problems is
>>>>> that
>>>>> starting with gcc-6.0 the default language standard is gnu++14 (instead of
>>>>> gnu++98) (see [1]). When using an operating system that has gcc >= 6.0 as
>>>>> system compiler (e.g. debian 9), this leads to two problems:
>>>>>
>>>>> 1) Because Ag++ uses the system compiler without specifying a language
>>>>> standard to generate puma.config, puma.config contains the line
>>>>> -D "__cplusplus=201402L" (C++14) instead of -D "__cplusplus=199711L"
>>>>> (C++98).
>>>>> This line causes AspectC++ to set the standard language of the internal
>>>>> Clang
>>>>> compiler instance to C++14 (-std=c++14). In c++14 mode Clang behaves
>>>>> different
>>>>> which leads to a different AspectC++ repo and to different woven code. In
>>>>> case
>>>>> of Bug598 "different" means wrong (see [2]). In case of
>>>>> ExecAdviceNewDelete
>>>>> "different" means that C++11 code is generated (which cannot be compiled
>>>>> using
>>>>> g++ in non-C++11 mode).
>>>>>
>>>>> 2) When executing the tests, the woven code is compiled using the system
>>>>> compiler without specifying a language standard. Due to this, g++ with
>>>>> implicit -std=gnu++14 is used to compile the woven code. This makes
>>>>> ExecAdviceNewDelete fail, because g++ does not like "void *operator new
>>>>> (size_t ) throw(std::bad_alloc);" in gnu++14 mode (probably because
>>>>> "throw(std::bad_alloc)" is deprecated in C++11). On the other hand,
>>>>> clang++ in
>>>>> gnu++14 mode does not complain, so this might be a g++ issue.
>>>>>
>>>>> To fix 1), AspectC++ should use gnu++98 as default (as on operating
>>>>> systems
>>>>> with gcc < 6.0). To accomplish this, either ag++ has to explicitly set
>>>>> gnu++98
>>>>> while generating puma.config or AspectC++ has to ignore -D
>>>>> "__cplusplus=XXXX"
>>>>> and provide an own mechanism to set the language standard that should be
>>>>> used
>>>>> for parsing and code generation. I would recommend the latter and would
>>>>> add a
>>>>> new command line argument "--std" to AspectC++ whose default value is
>>>>> "gnu++98" and which could look like the following:
>>>>> ...
>>>>> -c|--compile <arg> Name of the input file
>>>>> -o|--output <arg> Name of the output file
>>>>> --std <arg> Language standard used for parsing and
>>>>> code generation
>>>>> -i|--include_files Generate manipulated header files
>>>>> ...
>>>>>
>>>>> To fix 2), the woven test code should be compiled using gnu++98
>>>>> regardless of
>>>>> the system compiler's default language standard, because the tests were
>>>>> written on the supposition that gnu++98 is used. Of course tests can
>>>>> explicitly change the language standard if they rely on C++11 or C++14
>>>>> (e.g. using "--std c++11").
>>>>>
>>>>> Test Bug574 is "just" indeterminate behavior because the value of an
>>>>> uninitialized member is used in an if-clause.
>>>>>
>>>>> I already created commits for my recommended fixed and if no one has
>>>>> objections, I would push them. What do you think? Olaf, what is your
>>>>> opinion?
>>>>>
>>>>> Best regards,
>>>>>
>>>>> Simon
>>>>>
>>>>>
>>>>> [1] https://gcc.gnu.org/gcc-6/changes.html
>>>>> [2]
>>>>> template <typename TResult, typename TEntity>
>>>>> __attribute__((always_inline)) inline TResult __Get__Z4mainv_1_0
>>>>> (TEntity &ent,
>>>>> AC::RT<TResult>){
>>>>> typedef TJP__Z4mainv_1_0< const TResult, void, void, const char [2],
>>>>> AC::DILE, AC::TLE >
>>>>> __TJP;
>>>>> const TResult __result_buffer;
>>>>> AC::invoke_Bar_Bar__a0_before<__TJP> ();
>>>>> __result_buffer = ::arr;
>>>>> return (const TResult &)__result_buffer;
>>>>> }
>>>>> int main() {
>>>>> char x = __Get__Z4mainv_1_0< > (arr[1], __AC_TYPEOF((arr[1])) );
>>>>> return 0;
>>>>> }
>>>>>
>>>>> instead of
>>>>>
>>>>> template <typename TResult, typename TEntity, unsigned int TDim0,
>>>>> typename TIdx0>
>>>>> __attribute__((always_inline)) inline TResult __Get__Z4mainv_1_0
>>>>> (TEntity (&base)[TDim0],
>>>>> TIdx0
>>>>> idx0, AC::RT<TResult>){
>>>>> typedef TJP__Z4mainv_1_0< TResult, void, void, char, AC::DIL< 2, int,
>>>>> AC::DILE >, AC::TLE
>>>>>>
>>>>> __TJP;
>>>>> TResult __result_buffer;
>>>>> AC::invoke_Bar_Bar__a0_before<__TJP> ();
>>>>> __result_buffer = ::arr[idx0];
>>>>> return (TResult &)__result_buffer;
>>>>> }
>>>>> int main() {
>>>>> char x = __Get__Z4mainv_1_0< > (arr, (1), __AC_TYPEOF((arr[1])) );
>>>>> return 0;
>>>>> }
>>>>>
>>>>>
>>>>>> I've uploaded a new package that simply ignores failures from tests. Not
>>>>>> exactly an ideal
>>>>>> situation because it renders the test ineffective.
>>>>>>
>>>>>> From what I understand I could instead dialer disable these the tests
>>>>>> instead. But before
>>>>>> doing
>>>>>> that, I wanted to check with you if these failures also occurred on your
>>>>>> akut Test
>>>>>> infrastructure.
>>>>>> If yes, how do you deal with them, maybe you could disable the test in
>>>>>> svn. If they do not
>>>>>> appear
>>>>>> in akut, I wonder why.
>>>>>>
>>>>>> I agree that it's not super critical or urgent to me, but I think you
>>>>>> are in a much per
>>>>>> position
>>>>>> to assess the criticality and urgency.
>>>>>>
>>>>>> Thanks
>>>>>> Reinhard
>>>>>>
>>>>>> On August 29, 2017 12:19:21 PM EDT, Olaf Spinczyk
>>>>>> <[email protected]> wrote:
>>>>>>> Hi Reinhard!
>>>>>>>
>>>>>>> We should definitely look into these three problems within the next few
>>>>>>> weeks, but I don't regard them as very critical, because they affect
>>>>>>> only special use cases: Advice for user-defined "operator new"
>>>>>>> implementations and the code generation for get/set advice, which is a
>>>>>>> feature that is only enabled with --data_joinpoints and still a bit
>>>>>>> experimental.
>>>>>>>
>>>>>>> How to proceed? Can we/you live with these problems for now and update
>>>>>>> later or is there no update option and we have to fix it sooner?
>>>>>>>
>>>>>>> Cheers,
>>>>>>>
>>>>>>> Olaf
>>>>>>>
>>>>>>> On 08/24/2017 00:16, Reinhard Tartler wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 08/23/2017 12:07 PM, Olaf Spinczyk wrote:
>>>>>>>>> Hi!
>>>>>>>>>
>>>>>>>>> You can generate the config file easily with ag++ --gen_config.
>>>>>>> Sorry
>>>>>>>>> for the inconvenience. The background is that when I wrote the first
>>>>>>>>> ac++ tests, I did not want the makefile to depend on ag++.
>>>>>>>>>
>>>>>>>>> We should change that sooner or later, because it is obviously
>>>>>>> confusing.
>>>>>>>>
>>>>>>>> Not a problem.
>>>>>>>>
>>>>>>>> Progress! With a "correct" PUMA CONFIG, I now get further, but there
>>>>>>> seem to be
>>>>>>>> genuine test failures. Are they concerning or shall I ignore them for
>>>>>>> the debian
>>>>>>>> package?
>>>>>>>>
>>>>>>>> They look like this:
>>>>>>>>
>>>>>>>> /usr/bin/make -C tests -s all
>>>>>>>> make[2]: Entering directory
>>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests'
>>>>>>>>
>>>>>>> ...........................................[C:ExecAdviceNewDelete].................................................................................[D:Bug574].......[C:Bug598]........
>>>>>>>>
>>>>>>>>
>>>>>>>> +---------+
>>>>>>>> |ERRORS: |
>>>>>>>> +---------+
>>>>>>>>
>>>>>>>>
>>>>>>> -----------------------------------------------------------------------------
>>>>>>>> TEST: ExecAdviceNewDelete
>>>>>>>>
>>>>>>> -----------------------------------------------------------------------------
>>>>>>>> STDOUT:
>>>>>>>> --------
>>>>>>>> make[3]: Entering directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/ExecAdviceNewDelete'
>>>>>>>> Weaving main.cc
>>>>>>>> * Running ac++ 2.2
>>>>>>>> * Handling Translation Unit `main.cc'.
>>>>>>>> - Path "main.cc"
>>>>>>>> - Parsing ...
>>>>>>>> - Weaving Aspects Forward Declarations ...
>>>>>>>> - Inserting namespace AC
>>>>>>>> - Committing
>>>>>>>> - Preparing introductions ...
>>>>>>>> - Parsing again ...
>>>>>>>> - Weaving access control bypass classes ...
>>>>>>>> - Weaving Join Points ...
>>>>>>>> Advicecode manipulation
>>>>>>>> Collecting Advice
>>>>>>>> Setting up thisJoinPoint for aspectof
>>>>>>>> Create pointcut expression tree
>>>>>>>> Matching joinpoints
>>>>>>>> Aspect ordering ...
>>>>>>>> Creating project repository 'repo.acp'
>>>>>>>> Type Check Functions
>>>>>>>> Access Join Points
>>>>>>>> Execution Join Points
>>>>>>>> void *operator new(unsigned long int)
>>>>>>>> void *operator new[](unsigned long int)
>>>>>>>> void operator delete(void *)
>>>>>>>> void operator delete[](void *)
>>>>>>>> void A::operator delete(void *)
>>>>>>>> void *C::operator new(unsigned long int)
>>>>>>>> void C::operator delete(void *)
>>>>>>>> Construction Join Points
>>>>>>>> Destruction Join Points
>>>>>>>> - Aspect Includes ...
>>>>>>>> - Final cleanup
>>>>>>>> - Committing
>>>>>>>> * Inserting unit pro- and epilogues
>>>>>>>> - Manipulating translation unit file main.cc
>>>>>>>> * Updating #line directives of generated code fragments
>>>>>>>> * Saving
>>>>>>>> - Expanding project includes
>>>>>>>> - Fixing #line directives
>>>>>>>> - Path "main.acc"
>>>>>>>> * Done
>>>>>>>> Compiling main.acc
>>>>>>>> ../Makefile.generic:80: recipe for target 'Junk/main.o' failed
>>>>>>>> make[3]: Leaving directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/ExecAdviceNewDelete'
>>>>>>>>
>>>>>>>> STDERR:
>>>>>>>> --------
>>>>>>>> main.cc:5:30: warning: dynamic exception specifications are
>>>>>>> deprecated in C++11
>>>>>>>> [-Wdeprecated]
>>>>>>>> void *operator new (size_t ) throw(std::bad_alloc);
>>>>>>>> ^~~~~
>>>>>>>> main.cc:7:31: warning: dynamic exception specifications are
>>>>>>> deprecated in C++11
>>>>>>>> [-Wdeprecated]
>>>>>>>> void *operator new (size_t s) throw(std::bad_alloc) {
>>>>>>>> ^~~~~
>>>>>>>> main.cc: In function 'void* operator new(size_t)':
>>>>>>>> main.cc:7:7: error: declaration of 'void* operator new(size_t) throw
>>>>>>>> (std::bad_alloc)' has a different exception specifier
>>>>>>>> void *operator new (size_t s) throw(std::bad_alloc) {
>>>>>>>> ^~~~~~~~
>>>>>>>> main.cc:5:7: note: from previous declaration 'void* operator
>>>>>>> new(std::size_t)'
>>>>>>>> void *operator new (size_t ) throw(std::bad_alloc);
>>>>>>>> ^~~~~~~~
>>>>>>>> main.acc: In function 'void* operator new(std::size_t)':
>>>>>>>> main.acc:147:61: warning: dynamic exception specifications are
>>>>>>> deprecated in
>>>>>>>> C++11 [-Wdeprecated]
>>>>>>>> typedef TJP__Znwm_0< void *, void, void, void *(::size_t)
>>>>>>>> throw(std::bad_alloc), AC::TL< ::size_t, AC::TLE > > __TJP;
>>>>>>>> ^~~~~
>>>>>>>> main.cc: At global scope:
>>>>>>>> main.cc:11:33: warning: dynamic exception specifications are
>>>>>>> deprecated in C++11
>>>>>>>> [-Wdeprecated]
>>>>>>>> void *operator new[] (size_t s) throw(std::bad_alloc) {
>>>>>>>> ^~~~~
>>>>>>>> main.acc: In function 'void* operator new [](std::size_t)':
>>>>>>>> main.acc:198:61: warning: dynamic exception specifications are
>>>>>>> deprecated in
>>>>>>>> C++11 [-Wdeprecated]
>>>>>>>> typedef TJP__Znam_0< void *, void, void, void *(::size_t)
>>>>>>>> throw(std::bad_alloc), AC::TL< ::size_t, AC::TLE > > __TJP;
>>>>>>>> ^~~~~
>>>>>>>> make[3]: *** [Junk/main.o] Error 1
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> -----------------------------------------------------------------------------
>>>>>>>> TEST: Bug574
>>>>>>>>
>>>>>>> -----------------------------------------------------------------------------
>>>>>>>> STDOUT:
>>>>>>>> --------
>>>>>>>> make[3]: Entering directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/Bug574'
>>>>>>>> Weaving main.cc
>>>>>>>> * Running ac++ 2.2
>>>>>>>> * Handling Translation Unit `main.cc'.
>>>>>>>> - Path "main.cc"
>>>>>>>> - Parsing ...
>>>>>>>> - Weaving Aspects Forward Declarations ...
>>>>>>>> - Inserting namespace AC
>>>>>>>> - Committing
>>>>>>>> - Preparing introductions ...
>>>>>>>> - Parsing again ...
>>>>>>>> - Weaving access control bypass classes ...
>>>>>>>> - Weaving Join Points ...
>>>>>>>> Advicecode manipulation
>>>>>>>> Collecting Advice
>>>>>>>> Setting up thisJoinPoint for aspectof
>>>>>>>> Create pointcut expression tree
>>>>>>>> Matching joinpoints
>>>>>>>> Aspect ordering ...
>>>>>>>> Creating project repository 'repo.acp'
>>>>>>>> Type Check Functions
>>>>>>>> Access Join Points
>>>>>>>> Get: bool Cyg_SchedThread::priority_inherited
>>>>>>>> Get: int Cyg_SchedThread::original_priority
>>>>>>>> Execution Join Points
>>>>>>>> Construction Join Points
>>>>>>>> Destruction Join Points
>>>>>>>> - Aspect Includes ...
>>>>>>>> - Final cleanup
>>>>>>>> - Committing
>>>>>>>> * Inserting unit pro- and epilogues
>>>>>>>> - Manipulating translation unit file main.cc
>>>>>>>> * Updating #line directives of generated code fragments
>>>>>>>> * Saving
>>>>>>>> - Expanding project includes
>>>>>>>> - Fixing #line directives
>>>>>>>> - Path "main.acc"
>>>>>>>> * Done
>>>>>>>> Compiling main.acc
>>>>>>>> Linking
>>>>>>>> make[3]: Leaving directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/Bug574'
>>>>>>>> make[3]: Entering directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/Bug574'
>>>>>>>> 1a2
>>>>>>>>> int Cyg_SchedThread::original_priority
>>>>>>>> ../Makefile.generic:48: recipe for target 'diff' failed
>>>>>>>> make[3]: Leaving directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/Bug574'
>>>>>>>>
>>>>>>>> STDERR:
>>>>>>>> --------
>>>>>>>> make[3]: *** [diff] Error 1
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> -----------------------------------------------------------------------------
>>>>>>>> TEST: Bug598
>>>>>>>>
>>>>>>> -----------------------------------------------------------------------------
>>>>>>>> STDOUT:
>>>>>>>> --------
>>>>>>>> make[3]: Entering directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/Bug598'
>>>>>>>> Weaving main.cc
>>>>>>>> * Running ac++ 2.2
>>>>>>>> * Handling Translation Unit `main.cc'.
>>>>>>>> - Path "main.cc"
>>>>>>>> - Parsing ...
>>>>>>>> - Weaving Aspects Forward Declarations ...
>>>>>>>> - Inserting namespace AC
>>>>>>>> - Committing
>>>>>>>> - Preparing introductions ...
>>>>>>>> - Parsing again ...
>>>>>>>> - Weaving access control bypass classes ...
>>>>>>>> - Weaving Join Points ...
>>>>>>>> Advicecode manipulation
>>>>>>>> Collecting Advice
>>>>>>>> Setting up thisJoinPoint for aspectof
>>>>>>>> Create pointcut expression tree
>>>>>>>> Matching joinpoints
>>>>>>>> Aspect ordering ...
>>>>>>>> Creating project repository 'repo.acp'
>>>>>>>> Type Check Functions
>>>>>>>> Access Join Points
>>>>>>>> Get: char const arr[2]
>>>>>>>> Execution Join Points
>>>>>>>> Construction Join Points
>>>>>>>> Destruction Join Points
>>>>>>>> - Aspect Includes ...
>>>>>>>> - Final cleanup
>>>>>>>> - Committing
>>>>>>>> * Inserting unit pro- and epilogues
>>>>>>>> - Manipulating translation unit file main.cc
>>>>>>>> * Updating #line directives of generated code fragments
>>>>>>>> * Saving
>>>>>>>> - Expanding project includes
>>>>>>>> - Fixing #line directives
>>>>>>>> - Path "main.acc"
>>>>>>>> * Done
>>>>>>>> Compiling main.acc
>>>>>>>> ../Makefile.generic:80: recipe for target 'Junk/main.o' failed
>>>>>>>> make[3]: Leaving directory
>>>>>>>>
>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests/Bug598'
>>>>>>>>
>>>>>>>> STDERR:
>>>>>>>> --------
>>>>>>>> main.acc: In instantiation of 'TResult __Get__Z4mainv_1_0(TEntity&,
>>>>>>> AC::RT<T>)
>>>>>>>> [with TResult = char; TEntity = const char]':
>>>>>>>> main.cc:16:66: required from here
>>>>>>>> main.acc:283:17: error: uninitialized const '__result_buffer'
>>>>>>> [-fpermissive]
>>>>>>>> const TResult __result_buffer;
>>>>>>>> ^~~~~~~~~~~~~~~
>>>>>>>> main.acc:285:19: error: assignment of read-only variable
>>>>>>> '__result_buffer'
>>>>>>>> __result_buffer = ::arr;
>>>>>>>> ~~~~~~~~~~~~~~~~^~~~
>>>>>>>> main.acc:285:19: error: invalid conversion from 'const char*' to
>>>>>>> 'char'
>>>>>>>> [-fpermissive]
>>>>>>>> make[3]: *** [Junk/main.o] Error 1
>>>>>>>>
>>>>>>>> Makefile:161: recipe for target 'all' failed
>>>>>>>> make[2]: *** [all] Error 1
>>>>>>>> make[2]: Leaving directory
>>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++/tests'
>>>>>>>> Makefile:259: recipe for target 'testall' failed
>>>>>>>> make[1]: *** [testall] Error 2
>>>>>>>> make[1]: Leaving directory
>>>>>>>> '/build/aspectc++-rCVJRW/aspectc++-2.2+git20170823/AspectC++'
>>>>>>>> debian/rules:52: recipe for target 'test-builds' failed
>>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Sent from my cell phone. Please excuse my brevity and typos.
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>>
>>
>
>
>