From: Abramo Bagnara Date: Sat, 7 Jan 2012 10:52:36 +0000 (+0000) Subject: Fixed TypeofExpr AST and code generation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06284c1dc56caed19850bc3766c89f51763724c3;p=clang Fixed TypeofExpr AST and code generation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147730 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 389cf8ac72..b686d2dd43 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -1146,8 +1146,6 @@ public: DeclSpec &DS, MultiTemplateParamsArg TemplateParams); - StmtResult ActOnVlaStmt(const DeclSpec &DS); - Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record); diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 62d18ea8ee..cde2de9819 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -929,19 +929,33 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) { // We're going to walk down into the type and look for VLA // expressions. - type = type.getCanonicalType(); do { assert(type->isVariablyModifiedType()); 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(ty)->getUnderlyingExpr(); + EmitIgnoredExpr(E); + return; + } + #define TYPE(Class, Base) #define ABSTRACT_TYPE(Class, Base) -#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: +#define NON_CANONICAL_TYPE(Class, Base) #define DEPENDENT_TYPE(Class, Base) case Type::Class: -#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: +#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) #include "clang/AST/TypeNodes.def" - llvm_unreachable("unexpected dependent or non-canonical type!"); + llvm_unreachable("unexpected dependent type!"); // These types are never variably-modified. case Type::Builtin: @@ -999,7 +1013,7 @@ void CodeGenFunction::EmitVariablyModifiedType(QualType type) { break; } - case Type::FunctionProto: + case Type::FunctionProto: case Type::FunctionNoProto: type = cast(ty)->getResultType(); break; diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index ee4a51e184..16321491ee 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -962,10 +962,7 @@ Parser::DeclGroupPtrTy Parser::ParseSimpleDeclaration(StmtVector &Stmts, ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS_none, getDeclSpecContextFromDeclaratorContext(Context)); - StmtResult R = Actions.ActOnVlaStmt(DS); - if (R.isUsable()) - Stmts.push_back(R.release()); - + // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };" // declaration-specifiers init-declarator-list[opt] ';' if (Tok.is(tok::semi)) { diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d1bf3db19c..d80f22f7fe 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2481,25 +2481,6 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, return TagD; } -/// ActOnVlaStmt - This rouine if finds a vla expression in a decl spec. -/// builds a statement for it and returns it so it is evaluated. -StmtResult Sema::ActOnVlaStmt(const DeclSpec &DS) { - StmtResult R; - if (DS.getTypeSpecType() == DeclSpec::TST_typeofExpr) { - Expr *Exp = DS.getRepAsExpr(); - QualType Ty = Exp->getType(); - if (Ty->isPointerType()) { - do - Ty = Ty->getAs()->getPointeeType(); - while (Ty->isPointerType()); - } - if (Ty->isVariableArrayType()) { - R = ActOnExprStmt(MakeFullExpr(Exp)); - } - } - return R; -} - /// We are trying to inject an anonymous member into the given scope; /// check if there's an existing declaration that can't be overloaded. /// diff --git a/test/CodeGen/vla.c b/test/CodeGen/vla.c index c9612bc160..9e62da52e0 100644 --- a/test/CodeGen/vla.c +++ b/test/CodeGen/vla.c @@ -116,9 +116,6 @@ int test4(unsigned n, char (*p)[n][n+1][6]) { // CHECK-NEXT: [[T0:%.*]] = load i32* [[N]], align 4 // CHECK-NEXT: [[DIM1:%.*]] = add i32 [[T0]], 1 - // __typeof. FIXME: does this really need to be loaded? - // CHECK-NEXT: load [6 x i8]** [[P]] - // CHECK-NEXT: [[T0:%.*]] = load [6 x i8]** [[P]], align 4 // CHECK-NEXT: [[T1:%.*]] = load i32* [[N]], align 4 // CHECK-NEXT: [[T2:%.*]] = udiv i32 [[T1]], 2