I am not an expert on this, but I note that the section on -Wsequence-point at http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html specifically mentions ? and :. Perhaps some more work on tracking down their definitions and precedence might lead to insights.
Best, Kasper On Mon, Jun 23, 2014 at 6:42 PM, Hervé Pagès <hpa...@fhcrc.org> wrote: > On 06/23/2014 03:18 PM, Hervé Pagès wrote: > >> Hi Christian, >> >> On 06/23/2014 11:54 AM, cstrato wrote: >> >>> Dear Romain, >>> >>> I do not know enough about compilers, but as far as I remember, they >>> 'work' from right to left, >>> >> >> Not necessarily. So you should not rely on that. This is what the >> (somewhat obscure) warning you see on zin1 is trying to tell you. >> > > Actually, I don't see an ambiguity in your code: > > > numsels = (arrMask[i] == 1) ? ++numsels : numsels; > > Yes it's confusing and unnecessarily complicated but I don't see that > it relies on some undefined behavior. It's not like in the thread on > Bioc-devel where the expression was: > > *p++ = tolower(*p); > > In that case the left-value of the assignment is itself an expression > that needs to be evaluated and the outcome of the assignment depends > on whether the left-value is evaluated before the right expression or > not. But in your case the left-value is a variable name so there is > nothing to evaluate. > > So I don't know. Looks like a false positive from the gcc compiler to > me. Someone on the list might have a better insight. > > Cheers, > > H. > > > Personally I would just do: >> >> if (arrMask[i] == 1) numsels++; >> >> which is the standard way to implement the "if (some condition) >> then increment counter" idiom. >> >> As Kasper mentioned, a similar issue was recently discussed here: >> >> https://stat.ethz.ch/pipermail/bioc-devel/2014-June/005858.html >> >> Cheers, >> H. >> >> >> so numsels = ++numsels should not confuse the >>> compiler. Anyhow I will change my code to your first suggestion since it >>> is more elegant. >>> >>> Best regards, >>> Christian >>> >>> >>> On 6/23/14 7:13 PM, Romain François wrote: >>> >>>> >>>> Le 23 juin 2014 à 18:28, cstrato <cstr...@aon.at> a écrit : >>>> >>>> Dear Romain, >>>>> >>>>> Thank you for your suggestions, I like especially the first one. >>>>> >>>>> However, you did not explain why I have never got this warning >>>>> message on any compiler, and why only one of the two identical Ubuntu >>>>> compilers did give this warning message? >>>>> >>>>> Best regards, >>>>> Christian >>>>> >>>> >>>> I donât know, but this: >>>> >>>> numsels = ++numsels ; >>>> >>>> seems fishy to me, and so it keeps feeling weird with the addition of >>>> the ternary operator. >>>> >>>> There is obviously a difference of setup between these two machines, >>>> but I donât have time to sherlock that for you. One of the compilers >>>> is getting more careful than the other. Getting warnings you did not >>>> get before is a good thing, as it helps you update the code with that >>>> new insight. >>>> >>>> Welcome to my world, Iâm sometimes thrown all kinds of new warnings >>>> from esoteric compilers, all of them have value . >>>> >>>> Romain >>>> >>>> On 6/23/14 3:45 PM, Romain François wrote: >>>>> >>>>>> >>>>>> Le 23 juin 2014 à 15:20, cstrato <cstr...@aon.at> a écrit : >>>>>> >>>>>> Dear all, >>>>>>> >>>>>>> Since many years the following C++ code does compile on ALL >>>>>>> Bioconductor servers (Linux, Windows, Mac) without any warnings: >>>>>>> >>>>>>> Int_t numsels = 0; //number of selected entries >>>>>>> ... >>>>>>> for (Int_t i=0; i<size; i++) { >>>>>>> numsels = (arrMask[i] == 1) ? ++numsels : numsels; >>>>>>> }//for_i >>>>>>> >>>>>> >>>>>> This is confusing. I would write the loop body like this: >>>>>> >>>>>> numsels += (arrMask[i] == 1) ; >>>>>> >>>>>> >>>>>> or preferably using the STL: >>>>>> >>>>>> Int_t numsels = std::count( begin(arrMask), end(arrMask), 1 ) ; >>>>>> >>>>>> or some other variation of this, i.e. perhaps you donât have a C++11 >>>>>> compiler, so perhaps one of these depending on what is arrMask: >>>>>> >>>>>> Int_t numsels = std::count( arrMask.begin(), arrMask.end(), 1 ) ; >>>>>> Int_t numsels = std::count( arrMask, arrMask + size, 1 ) ; >>>>>> >>>>>> Romain >>>>>> >>>>>> Even on the recently added release server 'zin2' Linux (Ubuntu >>>>>>> 12.04.4 LTS) the above code compiles w/o warnings. >>>>>>> >>>>>>> However, on the new development server 'zin1' Linux (Ubuntu 12.04.4 >>>>>>> LTS) I get suddenly the following warning message: >>>>>>> >>>>>>> Found the following significant warnings: >>>>>>> XPSPreProcessing.cxx:3026:56: warning: operation on ânumselsâ may >>>>>>> be undefined [-Wsequence-point] >>>>>>> >>>>>>> Interestingly, both servers do not only run the same version of >>>>>>> Ubuntu, but also the same version of the C++ compiler, i.e. g++ >>>>>>> (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, and use the same flags, see: >>>>>>> http://bioconductor.org/checkResults/2.14/bioc-LATEST/ >>>>>>> zin2-NodeInfo.html >>>>>>> >>>>>>> >>>>>>> http://bioconductor.org/checkResults/devel/bioc- >>>>>>> LATEST/zin1-NodeInfo.html >>>>>>> >>>>>>> >>>>>>> >>>>>>> My question is now, why do I suddenly get the compiler warning? >>>>>>> >>>>>>> The reason why I ask at R-devel and not Bioc-devel is that it may >>>>>>> not only be a Bioc question, since I found the following links: >>>>>>> http://c-faq.com/expr/seqpoints.html >>>>>>> http://stackoverflow.com/questions/16838884/why-i-got- >>>>>>> operation-may-be-undefined-in-statement-expression-in-c >>>>>>> >>>>>>> >>>>>>> >>>>>>> I am not sure if I understand the meaning, but until now I have >>>>>>> never got any warning from any compiler the I have used (including >>>>>>> MS Visual C++). >>>>>>> >>>>>>> Do I really have to replace '++numsels' with 'numsels+1'? >>>>>>> >>>>>>> Best regards, >>>>>>> Christian >>>>>>> _._._._._._._._._._._._._._._._._._ >>>>>>> C.h.r.i.s.t.i.a.n S.t.r.a.t.o.w.a >>>>>>> V.i.e.n.n.a A.u.s.t.r.i.a >>>>>>> e.m.a.i.l: cstrato at aon.at >>>>>>> _._._._._._._._._._._._._._._._._._ >>>>>>> >>>>>>> ______________________________________________ >>>>>>> R-devel@r-project.org mailing list >>>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel >>>>>>> >>>>>> >>>>>> >>>>>> >>>> >>>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >> >> > -- > Hervé Pagès > > Program in Computational Biology > Division of Public Health Sciences > Fred Hutchinson Cancer Research Center > 1100 Fairview Ave. N, M1-B514 > P.O. Box 19024 > Seattle, WA 98109-1024 > > E-mail: hpa...@fhcrc.org > Phone: (206) 667-5791 > Fax: (206) 667-1319 > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]]
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel