[cfe-commits] r168895 - in /cfe/trunk: include/clang/Sema/Initialization.h lib/AST/ASTContext.cpp lib/CodeGen/CGCall.cpp lib/Sema/SemaDecl.cpp lib/Sema/SemaExpr.cpp test/Sema/merge-decls.c

Enea Zaffanella zaffanella at cs.unipr.it
Fri Jan 4 02:34:12 PST 2013


Hello Rafael.

Would you mind to double-check the following change in your commit?

On 11/29/2012 05:09 PM, Rafael Espindola wrote:
> Author: rafael
> Date: Thu Nov 29 10:09:03 2012
> New Revision: 168895
>
> URL: http://llvm.org/viewvc/llvm-project?rev=168895&view=rev
> Log:
> Merge function types in C.
[...]
>    * Use the type from the function type in initializations, even if an parameter
>      is available.
[...]
> Modified: cfe/trunk/include/clang/Sema/Initialization.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Initialization.h?rev=168895&r1=168894&r2=168895&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Initialization.h (original)
> +++ cfe/trunk/include/clang/Sema/Initialization.h Thu Nov 29 10:09:03 2012
[...]
> +  /// \brief Create the initialization entity for a parameter, but use
> +  /// another type.
> +  static InitializedEntity InitializeParameter(ASTContext &Context,
> +                                               ParmVarDecl *Parm,
> +                                               QualType Type) {
>       bool Consumed = (Context.getLangOpts().ObjCAutoRefCount &&
>                        Parm->hasAttr<NSConsumedAttr>());
>
>       InitializedEntity Entity;
>       Entity.Kind = EK_Parameter;
> -    Entity.Type = Context.getVariableArrayDecayedType(
> -                                       Parm->getType().getUnqualifiedType());
> +    Entity.Type = Context.getVariableArrayDecayedType(Type);

It seems to me that, this way, you are no longer unqualifying the 
parameter type. As a consequence, I now see the following:

$ cat bug.c
void foo1(void*);
void foo2(void* const);

void bar() {
   foo1(0);
   foo2(0);
}

In the call foo2(0), the null pointer implicit cast converts to a const 
qualified scalar rvalue, which should be forbidden; afaict, it should 
produce the very same cast as for the call foo1(0):

$ clang -cc1 -ast-dump bug.c
[...]
       (CallExpr 0x6310b50 <line:6:3, col:9> 'void'
         (ImplicitCastExpr 0x6310b38 <col:3> 'void (*)(void *const)' 
<FunctionToPointerDecay>
           (DeclRefExpr 0x6310ac8 <col:3> 'void (void *const)' Function 
0x62e5440 'foo2' 'void (void *const)'))
         (ImplicitCastExpr 0x6310b80 <col:8> 'void *const' <NullToPointer>
           (IntegerLiteral 0x6310af0 <col:8> 'int' 0))))))

Enea.




More information about the cfe-commits mailing list