[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