diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-02-12 00:15:05 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-02-12 00:15:05 +0000 |
| commit | 78ca74d81d9351e54677810ccbbedc6f0cfc4387 (patch) | |
| tree | 77ba24717c60f71f1664062806f6e9b9524761d4 /clang/lib/AST | |
| parent | f6d609a22722fb47389b5da80b5d84a8cace6d4f (diff) | |
| download | bcm5719-llvm-78ca74d81d9351e54677810ccbbedc6f0cfc4387.tar.gz bcm5719-llvm-78ca74d81d9351e54677810ccbbedc6f0cfc4387.zip | |
Introduce _Complex conversions into the function overloading
system. Since C99 doesn't have overloading and C++ doesn't have
_Complex, there is no specification for this. Here's what I think
makes sense.
Complex conversions come in several flavors:
- Complex promotions: a complex -> complex conversion where the
underlying real-type conversion is a floating-point promotion. GCC
seems to call this a promotion, EDG does something else. This is
given "promotion" rank for determining the best viable function.
- Complex conversions: a complex -> complex conversion that is
not a complex promotion. This is given "conversion" rank for
determining the best viable function.
- Complex-real conversions: a real -> complex or complex -> real
conversion. This is given "conversion" rank for determining the
best viable function.
These rules are the same for C99 (when using the "overloadable"
attribute) and C++. However, there is one difference in the handling
of floating-point promotions: in C99, float -> long double and double
-> long double are considered promotions (so we give them "promotion"
rank), while C++ considers these conversions ("conversion" rank).
llvm-svn: 64343
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/Type.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index d844d6c6bb0..24cf8535556 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -82,6 +82,10 @@ QualType Type::getDesugaredType() const { return TOE->getUnderlyingExpr()->getType(); if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this)) return TOT->getUnderlyingType(); + if (const ClassTemplateSpecializationType *Spec + = dyn_cast<ClassTemplateSpecializationType>(this)) + return Spec->getCanonicalTypeInternal(); + // FIXME: remove this cast. return QualType(const_cast<Type*>(this), 0); } |

