canonical type for C++11 auto

Hey all,

I want to scratch my own itch by fixing the issue that clang_getCanonicalType
does not deduce the type for variables such as `auto i = 1;`. See for context:

https://llvm.org/bugs/show_bug.cgi?id=18669
http://clang-developers.42468.n3.nabble.com/API-for-auto-type-deduction-in-libclang-td4037350.html

I added a simple unit test as the first step:

    $ cat test/Index/cxx11-print-type.cpp
    auto a = 1;

    // RUN: c-index-test -test-print-type -std=c++11 %s | FileCheck %s
    // CHECK: VarDecl=a:1:6 [type=auto] [typeKind=Unexposed]
    [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]

Running the first half manually I get:

    VarDecl=a:1:6 (Definition) [type=auto] [typekind=Unexposed] [isPOD=0]

Sadly, I'm a bit lost as to where I'd have to fix this. Looking at
CXType.cpp's clang_getCanonicalType implementation, I tried something like
this:

    fprintf(stderr, "--------------> undeduced?: %d\n", T->isUndeducedType());
    if (T->isUndeducedType()) {
      auto d = T->getContainedAutoType()->getDeducedType();
      fprintf(stderr, "--------------> deduced valid? %d\n", !d.isNull());
      if (!d.isNull()) {
        T = d;
      }
    }

This shows me that for the above input (i.e. `auto i = 1;`), the type is
undeduced, but I also cannot force deduction by getDeducedType (probably me
abusing/misinterpreting the API). So what can be done here - how could it be
fixed? Where would it be fixed?

Thanks

Ping?

Could anyone help me out? In what direction should I look? How can I resolve the “auto” QualType (as returned by e.g. T.getAsString())" to the underlying type - in my test code below “int”?

Any help would be greatly appreciated.

Bye

Ping?

Could anyone help me out? In what direction should I look? How can I
resolve the "auto" QualType (as returned by e.g. T.getAsString())" to the
underlying type - in my test code below "int"?

Any help would be greatly appreciated.

The problem is that libclang is looking at the TypeSourceInfo for the
variable declaration (VD->getTypeSourceInfo()), which contains just an
undeduced AutoType (that is, it contains the type as written). The deduced
type is present in the variable's type (VD->getType()) but not in the type
source information.

As I noted in the referenced thread, we could change this so that VarDecls'
TypeSourceInfo would include the deduced type. However, the same problem
exists for FunctionDecls (where the return type can involve an AutoType),
but we can't use the same approach there because we use the TypeSourceInfo
to track the declared type (which must match across redeclarations). It
would be preferable to have a solution that works for both cases, if
possible, and using the TypeSourceInfo to represent the declared type and
the declaration's type to represent the resolved type seems like the most
consistent approach.

Bye