Methods and AST incongruences

Tracking some related failures in our application I've found some
incongruences in clang AST that likely are bugs.

In the typescript below I see at least two problems:

a) in line marked // 1 the usual ImplicitCastExpr of kind
UserDefinedConversion used to mark implicit call to conversion operator
is missing

b) in line marked // 3 the method referred by MemberExpr is a builtin
with BoundMember kind while in line marked //1 and //2 has function type.

I'm right if I say that we have a bug in line // 1 for issue a) and a
bug in line //1 and //2 for issue b) ?

Once agreed on that (or on something different) we'll proceed to report
the related bugzilla issues and/or to try to fix the confirmed bugs.

$ cat z.cc
struct S {
  operator int();
  int foo();
};

void f() {
  S s;
  int f;
  f = s; // 1
  int f1 = s; // 2
  int f2;
  f2 = s.foo(); // 3
}
$ ~/llvm_new/Debug+Asserts/bin/clang -cc1 -ast-dump z.cc
typedef __int128_t __int128_t;
typedef __uint128_t __uint128_t;
struct __va_list_tag {
    struct __va_list_tag;
    unsigned int gp_offset;
    unsigned int fp_offset;
    void *overflow_arg_area;
    void *reg_save_area;
};
typedef struct __va_list_tag __va_list_tag;
typedef __va_list_tag __builtin_va_list[1];
struct S {
    struct S;
    int operator int();
    int foo();
    inline S() throw() (CompoundStmt 0x54da9e8 <z.cc:1:8>)

    inline S(const S &) throw();
};
void f() (CompoundStmt 0x54daea0 <z.cc:6:10, line:13:1>
  (DeclStmt 0x54daa30 <line:7:3, col:6>
    0x54da6e0 "S s =
      (CXXConstructExpr 0x54daa00 <col:5> 'struct S''void (void) throw()')")
  (DeclStmt 0x54daac0 <line:8:3, col:8>
    0x54daa60 "int f")
  (BinaryOperator 0x54dabe8 <line:9:3, col:7> 'int' lvalue '='
    (DeclRefExpr 0x54daad8 <col:3> 'int' lvalue Var 0x54daa60 'f' 'int')
    (CXXMemberCallExpr 0x54dabc0 <col:7> 'int'
      (MemberExpr 0x54dab88 <col:7, <invalid sloc>> 'int (void)'
.operator int 0x54da460
        (DeclRefExpr 0x54dab00 <col:7> 'struct S' lvalue Var 0x54da6e0
's' 'struct S'))))
  (DeclStmt 0x54dad28 <line:10:3, col:13>
    0x54dac20 "int f1 =
      (ImplicitCastExpr 0x54dad10 <col:12> 'int' <UserDefinedConversion>
        (CXXMemberCallExpr 0x54dace8 <col:12> 'int'
          (MemberExpr 0x54dacb0 <col:12, <invalid sloc>> 'int (void)'
.operator int 0x54da460
            (DeclRefExpr 0x54dac80 <col:12> 'struct S' lvalue Var
0x54da6e0 's' 'struct S'))))")
  (DeclStmt 0x54dadb0 <line:11:3, col:9>
    0x54dad50 "int f2")
  (BinaryOperator 0x54dae78 <line:12:3, col:14> 'int' lvalue '='
    (DeclRefExpr 0x54dadc8 <col:3> 'int' lvalue Var 0x54dad50 'f2' 'int')
    (CXXMemberCallExpr 0x54dae50 <col:8, col:14> 'int'
      (MemberExpr 0x54dae18 <col:8, col:10> '<bound member function

' .foo 0x54da520

        (DeclRefExpr 0x54dadf0 <col:8> 'struct S' lvalue Var 0x54da6e0
's' 'struct S')))))

Tracking some related failures in our application I've found some
incongruences in clang AST that likely are bugs.

In the typescript below I see at least two problems:

a) in line marked // 1 the usual ImplicitCastExpr of kind
UserDefinedConversion used to mark implicit call to conversion operator
is missing

Yeah, I'd call this a bug.

b) in line marked // 3 the method referred by MemberExpr is a builtin
with BoundMember kind while in line marked //1 and //2 has function type.

Same here; consistency is good.

John.

Fixed in r144850.