[cfe-commits] r71946 - in /cfe/trunk/lib/Sema: SemaDecl.cpp SemaExpr.cpp
Douglas Gregor
dgregor at apple.com
Mon May 18 11:29:53 PDT 2009
On May 16, 2009, at 6:54 AM, Eli Friedman wrote:
> Author: efriedma
> Date: Sat May 16 08:54:38 2009
> New Revision: 71946
>
> URL: http://llvm.org/viewvc/llvm-project?rev=71946&view=rev
> Log:
> Avoid calling mergeTypes in C++. I think these are the correct C++
> alternatives, but please correct me if I'm wrong.
>
> I eventually plan to assert in mergeTypes that we aren't in C++ mode
> because composite types are fundamentally not a part of C++. The
> remaining callers for code in the regression tests are
> Sema::WarnConflictingTypedMethods and
> CodeGenFunction::EmitFunctionProlog;
> I'm not quite sure what the correct approach is for those callers.
>
>
> Modified:
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaExpr.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=71946&r1=71945&r2=71946&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Sat May 16 08:54:38 2009
> @@ -916,7 +916,13 @@
> MergeAttributes(New, Old, Context);
>
> // Merge the types
> - QualType MergedT = Context.mergeTypes(New->getType(), Old->getType
> ());
> + QualType MergedT;
> + if (getLangOptions().CPlusPlus) {
> + if (Context.hasSameType(New->getType(), Old->getType()))
> + MergedT = New->getType();
> + } else {
> + MergedT = Context.mergeTypes(New->getType(), Old->getType());
> + }
> if (MergedT.isNull()) {
> Diag(New->getLocation(), diag::err_redefinition_different_type)
> << New->getDeclName();
This is slightly too strict in C++, because it's okay to redeclare a
variable that has an incomplete type with a complete type (and vice
versa). Here's a test case that used to work in C++ but doesn't now:
extern int array[10];
extern int array[];
extern int array[10];
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=71946&r1=71945&r2=71946&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat May 16 08:54:38 2009
> @@ -3727,14 +3727,24 @@
> rex->getType()))
> return QualType();
>
> - // Pointee types must be compatible.
> - if (!Context.typesAreCompatible(
> - Context.getCanonicalType(lpointee).getUnqualifiedType
> (),
> - Context.getCanonicalType(rpointee).getUnqualifiedType
> ())) {
> - Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
> - << lex->getType() << rex->getType()
> - << lex->getSourceRange() << rex->getSourceRange();
> - return QualType();
> + if (getLangOptions().CPlusPlus) {
> + // Pointee types must be the same: C++ [expr.add]
> + if (!Context.hasSameUnqualifiedType(lpointee, rpointee)) {
> + Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
> + << lex->getType() << rex->getType()
> + << lex->getSourceRange() << rex->getSourceRange();
> + return QualType();
> + }
> + } else {
> + // Pointee types must be compatible C99 6.5.6p3
> + if (!Context.typesAreCompatible(
> + Context.getCanonicalType
> (lpointee).getUnqualifiedType(),
> + Context.getCanonicalType
> (rpointee).getUnqualifiedType())) {
> + Diag(Loc, diag::err_typecheck_sub_ptr_compatible)
> + << lex->getType() << rex->getType()
> + << lex->getSourceRange() << rex->getSourceRange();
> + return QualType();
> + }
> }
This looks good.
- Doug
More information about the cfe-commits
mailing list