<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"><base href="x-msg://1778/"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jun 6, 2012, at 9:42 , "Lewis, Jason" <<a href="mailto:jason.lewis@gentex.com">jason.lewis@gentex.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div lang="EN-US" link="blue" vlink="purple" style="font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div class="WordSection1" style="page: WordSection1; "><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">Hello,<o:p></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><o:p> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><o:p> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">I’ve been working with Clang for a couple of days and I can’t help feeling like I am missing something. When I parse out the following:<o:p></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><o:p> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">void HandleBlah(std::string const& in, std::string& out)<o:p></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">{<o:p></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">    // do something<o:p></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">}<o:p></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><o:p> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">It doesn’t seem to recognize the qualifier const. However if I omit the reference it seems as though it works. It doesn’t seem as if there is any indication either in ParmVarDecl or Qualifiers or QualType that a developer can deduce if the parameter is a pointer or reference type. How can I detect whether or not a parameter is a reference? I suspect it is something to do in how I have set up my project. I am using a SemaConsumer being passed into the Process function and I only care about top level function declarations. Thank you in advance!<o:p></o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><o:p> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; "><o:p> </o:p></div><div style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; ">-JR<o:p></o:p></div></div></div></blockquote><br></div><div>The answer lies in the difference between these two types:</div><div><br></div><div>typedef char const *constant_string;</div><div>typedef char * const fixed_string;</div><div><br></div><div>The former is a mutable pointer to immutable characters, the latter is an immutable pointer to mutable characters.</div><div><br></div><div>QualType is actually just a wrapper around Type (and its subclasses). Pretty much anything you can const_cast away lives on QualType (the Qualifiers), but for everything else you'll want to pull out the underlying Type and work with that. Conveniently, you can use * and -> on QualType to get at the Type like a smart pointer.</div><div><br></div><div>So the way those typedefs are built in Clang looks like this:</div><div><br></div><div>TypedefType(constant_string) -> QualType(no qualifiers) -> PointerType -> QualType(const) -> BuiltinType(char)</div><div>TypedefType(fixed_string) -> QualType(const) -> PointerType -> Qualtype(no qualifiers) -> BuiltinType(char)</div><div><br></div><div>(I'm doing these from memory, so the details are probably a bit off.)</div><div><br></div><div>And your example of 'std::string const &' looks like this:</div><div><br></div><div>QualType(no qualifiers) -> ReferenceType -> QualType(const) -> RecordType(std::string)</div><div><br></div><div>Hope that helps,</div><div>Jordan</div><br></body></html>