[cfe-commits] r95782 - in /cfe/trunk: lib/AST/ASTImporter.cpp lib/Frontend/ASTMerge.cpp test/ASTMerge/Inputs/var1.c test/ASTMerge/Inputs/var2.c test/ASTMerge/var.c

Daniel Dunbar daniel at zuster.org
Thu Feb 11 08:35:24 PST 2010


Hi Doug,

On Wed, Feb 10, 2010 at 9:16 AM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Wed Feb 10 11:16:49 2010
> New Revision: 95782
>
> URL: http://llvm.org/viewvc/llvm-project?rev=95782&view=rev
> Log:
> Teach AST merging that variables with incomplete array types can be
> merged with variables of constant array types. Also, make sure that we
> call DiagnosticClient's BeginSourceFile/EndSourceFile, so that it has
> a LangOptions to work with.
>
> Modified:
>    cfe/trunk/lib/AST/ASTImporter.cpp
>    cfe/trunk/lib/Frontend/ASTMerge.cpp
>    cfe/trunk/test/ASTMerge/Inputs/var1.c
>    cfe/trunk/test/ASTMerge/Inputs/var2.c
>    cfe/trunk/test/ASTMerge/var.c
>
> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=95782&r1=95781&r2=95782&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
> +++ cfe/trunk/lib/AST/ASTImporter.cpp Wed Feb 10 11:16:49 2010
> @@ -500,6 +500,33 @@
>             break;
>           }
>
> +          if (const IncompleteArrayType *FoundArray
> +                = Importer.getToContext().getAsIncompleteArrayType(
> +                                                        FoundVar->getType())) {
> +            if (const ConstantArrayType *TArray
> +                  = Importer.getToContext().getAsConstantArrayType(T)) {
> +              if (Importer.getToContext().typesAreCompatible(
> +                                               TArray->getElementType(),
> +                                               FoundArray->getElementType())) {
> +                FoundVar->setType(T);
> +                MergeWithVar = FoundVar;
> +                break;
> +              }
> +            }
> +          } else if (const IncompleteArrayType *TArray
> +                        = Importer.getToContext().getAsIncompleteArrayType(T)) {
> +            if (const ConstantArrayType *FoundArray
> +                   = Importer.getToContext().getAsConstantArrayType(
> +                                                         FoundVar->getType())) {
> +              if (Importer.getToContext().typesAreCompatible(
> +                                               TArray->getElementType(),
> +                                               FoundArray->getElementType())) {
> +                MergeWithVar = FoundVar;
> +                break;
> +              }
> +            }
> +          }

I think this would be more succinct if it just did two getAsArrayType
calls, then checked that only one was incomplete?

 - Daniel

>           Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
>             << Name << T << FoundVar->getType();
>           Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
>
> Modified: cfe/trunk/lib/Frontend/ASTMerge.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTMerge.cpp?rev=95782&r1=95781&r2=95782&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ASTMerge.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTMerge.cpp Wed Feb 10 11:16:49 2010
> @@ -32,6 +32,8 @@
>
>  void ASTMergeAction::ExecuteAction() {
>   CompilerInstance &CI = getCompilerInstance();
> +  CI.getDiagnostics().getClient()->BeginSourceFile(
> +                                         CI.getASTContext().getLangOptions());
>   CI.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument,
>                                        &CI.getASTContext());
>   for (unsigned I = 0, N = ASTFiles.size(); I != N; ++I) {
> @@ -68,8 +70,8 @@
>     delete Unit;
>   }
>
> -
> -  return AdaptedAction->ExecuteAction();
> +  AdaptedAction->ExecuteAction();
> +  CI.getDiagnostics().getClient()->EndSourceFile();
>  }
>
>  void ASTMergeAction::EndSourceFileAction() {
>
> Modified: cfe/trunk/test/ASTMerge/Inputs/var1.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ASTMerge/Inputs/var1.c?rev=95782&r1=95781&r2=95782&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/ASTMerge/Inputs/var1.c (original)
> +++ cfe/trunk/test/ASTMerge/Inputs/var1.c Wed Feb 10 11:16:49 2010
> @@ -1,3 +1,7 @@
>  int *x0;
>  float **x1;
>  #include "var1.h"
> +int xarray0[17];
> +int xarray1[];
> +int xarray2[18];
> +int xarray3[18];
>
> Modified: cfe/trunk/test/ASTMerge/Inputs/var2.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ASTMerge/Inputs/var2.c?rev=95782&r1=95781&r2=95782&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/ASTMerge/Inputs/var2.c (original)
> +++ cfe/trunk/test/ASTMerge/Inputs/var2.c Wed Feb 10 11:16:49 2010
> @@ -1,3 +1,7 @@
>  int *x0;
>  double *x1;
>  int x2;
> +int xarray0[17];
> +int xarray1[17];
> +int xarray2[];
> +int xarray3[17];
>
> Modified: cfe/trunk/test/ASTMerge/var.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ASTMerge/var.c?rev=95782&r1=95781&r2=95782&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/ASTMerge/var.c (original)
> +++ cfe/trunk/test/ASTMerge/var.c Wed Feb 10 11:16:49 2010
> @@ -7,3 +7,5 @@
>  // CHECK: var2.c:3:5: error: external variable 'x2' declared with incompatible types in different translation units ('int' vs. 'double')
>  // CHECK: In file included from{{.*}}var1.c:3:
>  // CHECK: var1.h:1:8: note: declared here with type 'double'
> +// CHECK: error: external variable 'xarray3' declared with incompatible types in different translation units ('int [17]' vs. 'int [18]')
> +// CHECK: var1.c:7:5: note: declared here with type 'int [18]'
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list