[cfe-dev] canonical type for C++11 auto

Richard Smith richard at metafoo.co.uk
Thu Jul 30 14:38:06 PDT 2015


On Thu, Jul 30, 2015 at 1:48 PM, Milian Wolff <mail at milianw.de> wrote:

> 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
>
>
>
> On Sunday, July 26, 2015 03:31:14 PM Milian Wolff wrote:
>
> > 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-l
>
> > ibclang-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
>
>
>
> --
>
> Milian Wolff
>
> mail at milianw.de
>
> http://milianw.de
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150730/e93f715a/attachment.html>


More information about the cfe-dev mailing list