[PATCH] D10881: [Sema] Catch a case when 'volatile' qualifier is dropped while binding

~paul via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 17 15:52:12 PDT 2015


cynecx added a comment.

Hi :),

First of all, I would like to say that I am new into all the clang stuff (software architecture/internal concepts) but I wanted to start hacking clang so I went here to check out some ##trivial## clang bugs to fix so I can learn internal stuff about clang, with internal stuff I mean how AST/Sema are implemented and kinda these things.

So basically, I tried all the day long to find a better approach as @rjmccall explained that the key issue is that you can't copy-construct a ##W## from a ##volatile W&##. The issue might be in ##SemaInit.cpp## -> ##ResolveConstructorOverload## because when the ##NamedDecl*## loop reaches the ##const S&## constructor it doesn't know that it's actually copy-constructed so it's not setting ##SuppressUserConversions## to ##true##. This has the effect that ##AddTemplateOverloadCandidate## also includes user-conversion functions, so in this case: ##S(volatile W)## and this is actually what causes the infinity loop: ##PerformCopyInitialization -> InitializationSequence::Perform ->CompleteConstructorCall -> GatherArgumentsForCall -> ...##.
While debugging I basically changed the ##SuppressUserConversions## variable to true for the ##W (const S&)## constructor and this solved the infinity-loop problem and produced a gcc similar diagnostic message:

  simplified.cpp:13:7: error: no matching constructor for initialization of 'W'
    S s(*w);
        ^~
  simplified.cpp:3:8: note: candidate constructor (the implicit copy constructor) not viable: 1st argument ('volatile W')
        would lose volatile qualifier
  struct W {
         ^
  simplified.cpp:3:8: note: candidate constructor (the implicit move constructor) not viable: 1st argument ('volatile W')
        would lose volatile qualifier
  struct W {
         ^
  simplified.cpp:4:3: note: candidate constructor not viable: no known conversion from 'volatile W' to 'const S &' for
        1st argument
    W( const S& ) {}
    ^
  simplified.cpp:8:15: note: passing argument to parameter here
    S(volatile W) {}

It would be nice if anyone could check if this is a right approach for fixing this issue.
Thank you.


http://reviews.llvm.org/D10881





More information about the cfe-commits mailing list