MarcusJohnson91 marked 5 inline comments as done.
MarcusJohnson91 added inline comments.
================
Comment at: clang/lib/AST/Expr.cpp:1091
+ if (llvm::convertUTF32ToUTF8String(AR, Output)) {
+ CString = new char[Output.size() + 1];
+ memcpy(CString, Output.c_str(), Output.size());
----------------
efriedma wrote:
> This leaks memory.
>
> This function should return either a StringRef to memory that's part of AST
> object, or an std::string.
I've switched over to using getStringAsChar and doing the conversion there
instead of in getStrDataAsChar, on the other patch. (just going through this
review to see if I missed any feedback)
================
Comment at: clang/lib/AST/Type.cpp:1962
+bool Type::isType(const std::string TypeName) const {
+ QualType Desugar = this->getLocallyUnqualifiedSingleStepDesugaredType();
----------------
efriedma wrote:
> MarcusJohnson91 wrote:
> > aaron.ballman wrote:
> > > Oh, I see now that this is doing a name comparison against the type --
> > > that's not a good API in general because it's *really* hard to guess at
> > > what the type will come out as textually. e.g., `class` and `struct`
> > > keywords are interchangeable in C++, C sometimes gets confused with
> > > `bool` vs `_Bool`, template arguments sometimes matter, nested name
> > > specifiers, etc. Callers of this API will have to guess at these details
> > > and the printing of the type may change over time (e.g., C may switch
> > > from `_Bool` to `bool` and then code calling `isType("_Bool")` may react
> > > poorly to the change).
> > >
> > > I think we need to avoid this sort of API on `Type`.
> > I see your point, I reverted the behavior back to doing the desugaring in
> > just isChar16Type and isChar32Type
> I'm not convinced we should be looking at sugar even in
> isChar16Type/isChar32Type/isAnyCharacterType. That seems like a great way to
> end up with subtle bugs that only manifest when someone uses the wrong
> typedef.
>
> Where is the distinction between the value `(uint32_t)1` vs. `(char32_t)1`
> relevant for C, anyway?
char32_t is a typedef, not a builtin type in C.
the underlying type is uint_least32_t, which is usually another typedef to int.
in order for char32_t to be accepted in C mode, we have to know that it is a
string type and not just some random array, so I'm checking the sugar to see if
char32_t appears in the typedef chain.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D103426/new/
https://reviews.llvm.org/D103426
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits