[cfe-commits] Source code fidelity problem after commit 168895.
Enea Zaffanella
zaffanella at cs.unipr.it
Wed Jan 2 10:26:49 PST 2013
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.
After this commit, for the following code
$ cat merge.c
typedef int A;
A f();
typedef int B;
B f();
we obtain the following AST dump, where typedef B gets replaced by A in
the second declaration of f():
$ clang -cc1 -ast-dump merge.c
[...]
(TypedefDecl 0x4e1f220 <merge.c:1:1, col:13> A 'int')
(FunctionDecl 0x4e1f310 <line:2:1, col:5> f 'A ()')
(TypedefDecl 0x4e1f3c0 <line:3:1, col:13> B 'int')
(FunctionDecl 0x4e1f480 <line:4:1, col:5> f 'A ()'))
The chunk responsible for this problem seems to be the following:
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=168895&r1=168894&r2=168895&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Nov 29 10:09:03 2012
> @@ -2402,6 +2402,12 @@
> if (getLangOpts().CPlusPlus)
> return MergeCXXFunctionDecl(New, Old, S);
>
> + // Merge the function types so the we get the composite types for the return
> + // and argument types.
> + QualType Merged = Context.mergeTypes(Old->getType(), New->getType());
> + if (!Merged.isNull())
> + New->setType(Merged);
> +
> return false;
> }
As a bare minimum, I'd suggest to exchange the order of arguments in the
call to mergeTypes():
- QualType Merged = Context.mergeTypes(Old->getType(), New->getType());
+ QualType Merged = Context.mergeTypes(New->getType(), Old->getType());
This will fix (just) the test case above ...
however, in general, what happens to the *syntactic* type after merging?
Is it going to be simply discarded (i.e., replaced by the merged one)?
If so, what about source code fidelity?
Enea.
More information about the cfe-commits
mailing list