[cfe-commits] r147730 - in /cfe/trunk: include/clang/Sema/Sema.h lib/CodeGen/CodeGenFunction.cpp lib/Parse/ParseDecl.cpp lib/Sema/SemaDecl.cpp test/CodeGen/vla.c
Abramo Bagnara
abramo.bagnara at gmail.com
Sat Jan 7 15:17:56 PST 2012
Il 07/01/2012 21:33, Douglas Gregor ha scritto:
>
> On Jan 7, 2012, at 2:52 AM, Abramo Bagnara wrote:
>
>> Author: abramo
>> Date: Sat Jan 7 04:52:36 2012
>> New Revision: 147730
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=147730&view=rev
>> Log:
>> Fixed TypeofExpr AST and code generation.
>>
>> Modified:
>> cfe/trunk/include/clang/Sema/Sema.h
>> cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>> cfe/trunk/lib/Parse/ParseDecl.cpp
>> cfe/trunk/lib/Sema/SemaDecl.cpp
>> cfe/trunk/test/CodeGen/vla.c
>>
>> Modified: cfe/trunk/include/clang/Sema/Sema.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=147730&r1=147729&r2=147730&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Sema/Sema.h (original)
>> +++ cfe/trunk/include/clang/Sema/Sema.h Sat Jan 7 04:52:36 2012
>> @@ -1146,8 +1146,6 @@
>> DeclSpec &DS,
>> MultiTemplateParamsArg TemplateParams);
>>
>> - StmtResult ActOnVlaStmt(const DeclSpec &DS);
>> -
>> Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
>> AccessSpecifier AS,
>> RecordDecl *Record);
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=147730&r1=147729&r2=147730&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Sat Jan 7 04:52:36 2012
>> @@ -929,19 +929,33 @@
>>
>> // 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<TypeOfExprType>(ty)->getUnderlyingExpr();
>> + EmitIgnoredExpr(E);
>> + return;
>> + }
>
> Do you also need to handle decltype?
In C++11 7.1.6.2p4 it is written "The operand of the decltype specifier
is an unevaluated operand".
But it is also true that C++11 does not have VLA (and therefore does not
take in account them).
gcc 4.6.1 obey C++11 7.1.6.2p4 also for VM types.
IMHO it is better to avoid code generation for decltype, but I'd like to
hear your opinion about that.
More information about the cfe-commits
mailing list