[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