New guy trying to figure out where the parsing is happening

Hey guys,

I’m a serious newbie at LLVMing. I’ve been trying to figure out how to solve
http://llvm.org/bugs/show_bug.cgi?id=18443.

I’ve discovered where the error is being triggered, and that is in TreeTransform::TransformUnaryExprOrTypeTraitExpr(). However, I don’t feel that this is the correct place to fix the problem, I think the correct place would be to make it so that

sizeof(T::type); 
and
sizeof(typename T::type);

Parse to the same Expr. I’ve been debugging clang with VS trying to figure out where/when/how this thing is parsed, and all I ever see (in Lexer::Lex) are headers being parsed. Can anyone point me to the code that creates the Expr objects for this code? At the moment, I can’t even identify what type of Expr “typename T::type” would parse to, let alone try to make “T::type” parse to the same thing.

If you don’t know the answer, is there a good place to start for diving into developing on clang? I’m still not sure I’m clear on the differences between parsing, AST, lexing, and sema transforms. I would very much appreciate any help on these topics, anywhere between someone saying, “hey, go read this readme/webpage” to someone actually pointing me to the correct piece of code. I feel like I’ve been spinning my wheels on this one.

I really want to get involved in making clang more robust with Windows (at some point probably including diving into the SEH problem), I just seem to need some help getting started.

Thanks,
JB

Hey guys,

I’m a serious newbie at LLVMing. I’ve been trying to figure out how to solve
http://llvm.org/bugs/show_bug.cgi?id=18443.

I’ve discovered where the error is being triggered, and that is in TreeTransform::TransformUnaryExprOrTypeTraitExpr(). However, I don’t feel that this is the correct place to fix the problem, I think the correct place would be to make it so that

sizeof(T::type); 
and
sizeof(typename T::type);

Parse to the same Expr.

That would break the case where T::type is an expression rather than a type:

struct S { static const int type = 0; };
template struct X {
int k = sizeof(T::type);
};
static_assert(X().k == sizeof(int), “”);

The right way to fix this is probably to detect the case of a ParenExpr containing a “type-shaped” expression (maybe just a dependent-scoped decl ref expr for now) in TransformUnaryExprOrTypeTrait, and to transform it into the intended type if the name instantiates to a type.