[cfe-commits] r83116 - in /cfe/trunk: include/clang/AST/Type.h include/clang/Analysis/PathSensitive/MemRegion.h lib/AST/Type.cpp lib/Analysis/RegionStore.cpp lib/Sema/Sema.cpp lib/Sema/SemaDeclCXX.cpp

John McCall rjmccall at apple.com
Tue Sep 29 17:25:05 PDT 2009


Douglas Gregor wrote:
>> +  /// getUnqualifiedDesugaredType() - Return the specified type with
>> +  /// any "sugar" removed from the type, removing any typedefs,
>> +  /// typeofs, etc., as well as any qualifiers.
>> +  const Type *getUnqualifiedDesugaredType() const;
> [snip]
>> +/// getUnqualifiedDesugaredType - Pull any qualifiers and syntactic
>> +/// sugar off the given type.  This should produce an object of the
>> +/// same dynamic type as the canonical type.
>> +const Type *Type::getUnqualifiedDesugaredType() const {
>> +  const Type *Cur = this;
>> +
>> +  while (true) {
>> +    switch (Cur->getTypeClass()) {
>> +#define ABSTRACT_TYPE(Class, Parent)
>> +#define TYPE(Class, Parent) \
>> +    case Class: { \
>> +      const Class##Type *Ty = cast<Class##Type>(Cur); \
>> +      if (!Ty->isSugared()) return Cur; \
>> +      Cur = Ty->desugar().getTypePtr(); \
>> +      break; \
>> +    }
>> +#include "clang/AST/TypeNodes.def"
>> +    }
>> +  }
>> }
>
> I think it's just a minor documentation issue, but this routine won't 
> remove *all* qualifiers. For example, I expect that, given
>
>     typedef const int CInt1;
>     typedef CInt1 CInt2;
>     typedef CInt2 CInt3;
>
> desugaring "CInt3" will get us CInt2, which still points to a 
> const-qualified type. That's the right behavior IMO, but I think the 
> comment for getUnqualifedDesugaredType should make that clear.

getUnqualifiedDesugaredType() is a multi-step desugar --- witness the 
loop --- and will indeed get us down to 'int'.  The postcondition is 
that the returned type should never be sugared and hence should exactly 
match the (outermost) type of the canonical type, which is what makes 
the cast in getAs<> sound.

John.



More information about the cfe-commits mailing list