diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 19 | 
1 files changed, 15 insertions, 4 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 079c16ac6b2..ea121165fc2 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -4973,13 +4973,24 @@ static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context,    Done = false;    while (!Done) { -    switch (*Str++) { +    switch (char c = *Str++) {        default: Done = true; --Str; break;        case '*': -        Type = Context.getPointerType(Type); -        break;        case '&': -        Type = Context.getLValueReferenceType(Type); +        { +          // Both pointers and references can have their pointee types +          // qualified with an address space. +          char *End; +          unsigned AddrSpace = strtoul(Str, &End, 10); +          if (End != Str && AddrSpace != 0) { +            Type = Context.getAddrSpaceQualType(Type, AddrSpace); +            Str = End; +          } +        } +        if (c == '*') +          Type = Context.getPointerType(Type); +        else +          Type = Context.getLValueReferenceType(Type);          break;        // FIXME: There's no way to have a built-in with an rvalue ref arg.        case 'C':  | 

