aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenFunction.cpp
diff options
context:
space:
mode:
authorAbramo Bagnara <abramo.bagnara@gmail.com>2012-01-11 08:19:46 +0000
committerAbramo Bagnara <abramo.bagnara@gmail.com>2012-01-11 08:19:46 +0000
commit5ff53b27dfd918a5d9943cd008de51edc8cbec2c (patch)
tree4682af5e7b107d85e3f19c271dfa2211e8e1e6e7 /lib/CodeGen/CodeGenFunction.cpp
parent3e97758f22f31d0dbc336fc4794b86aed8607053 (diff)
Fixed VLA code generation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147933 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r--lib/CodeGen/CodeGenFunction.cpp36
1 files changed, 22 insertions, 14 deletions
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index cde2de9819..5c21b0762b 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -935,20 +935,6 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) {
const Type *ty = type.getTypePtr();
switch (ty->getTypeClass()) {
- default:
- // Only sugared types (different from typeof_expr) can reach this point.
- assert(!type.isCanonical() && "unhandled canonical type!");
- type = type.getSingleStepDesugaredType(getContext());
- break;
-
- case Type::TypeOfExpr: {
- // This is the only sugared type requiring special treatment.
- // Emit typeof expression and we are done.
- Expr *E = cast<TypeOfExprType>(ty)->getUnderlyingExpr();
- EmitIgnoredExpr(E);
- return;
- }
-
#define TYPE(Class, Base)
#define ABSTRACT_TYPE(Class, Base)
#define NON_CANONICAL_TYPE(Class, Base)
@@ -964,6 +950,8 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) {
case Type::ExtVector:
case Type::Record:
case Type::Enum:
+ case Type::Elaborated:
+ case Type::TemplateSpecialization:
case Type::ObjCObject:
case Type::ObjCInterface:
case Type::ObjCObjectPointer:
@@ -1018,6 +1006,26 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) {
type = cast<FunctionType>(ty)->getResultType();
break;
+ case Type::Paren:
+ case Type::TypeOf:
+ case Type::UnaryTransform:
+ case Type::Attributed:
+ case Type::SubstTemplateTypeParm:
+ // Keep walking after single level desugaring.
+ type = type.getSingleStepDesugaredType(getContext());
+ break;
+
+ case Type::Typedef:
+ case Type::Decltype:
+ case Type::Auto:
+ // Stop walking: nothing to do.
+ return;
+
+ case Type::TypeOfExpr:
+ // Stop walking: emit typeof expression.
+ EmitIgnoredExpr(cast<TypeOfExprType>(ty)->getUnderlyingExpr());
+ return;
+
case Type::Atomic:
type = cast<AtomicType>(ty)->getValueType();
break;