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 >>> <olaf.spinc...@tu-dortmund.de> 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. >> >> >> >