<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 01/09/16 02:59, Akira Hatanaka
wrote:<br>
</div>
<blockquote
cite="mid:4113870F-42E1-4B34-B800-52A679812760@apple.com"
type="cite">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<div class="">I’ve come up with a patch and sent it to the list
today since it is urgent to fix.</div>
<div class=""><br class="">
</div>
<div class=""><a moz-do-not-send="true"
href="https://reviews.llvm.org/D24110" class="">https://reviews.llvm.org/D24110</a></div>
<div class=""><br class="">
</div>
Thank you.</blockquote>
I saw it landed in the trunk. Thanks!<br>
<blockquote
cite="mid:4113870F-42E1-4B34-B800-52A679812760@apple.com"
type="cite">
<div class=""><br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Aug 31, 2016, at 1:50 PM, Vassil Vassilev
<<a moz-do-not-send="true"
href="mailto:v.g.vassilev@gmail.com" class="">v.g.vassilev@gmail.com</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<meta content="text/html; charset=utf-8"
http-equiv="Content-Type" class="">
<div bgcolor="#FFFFFF" text="#000000" class="">
<div class="moz-cite-prefix">Hi Akira,<br class="">
Thanks for your email. I am on vacation right now
and I will try to look at this issue as soon as I can.<br
class="">
Sorry for the inconvenience.<br class="">
Cheers,<br class="">
Vassil<br class="">
On 31/08/16 22:56, Akira Hatanaka wrote:<br class="">
</div>
<blockquote
cite="mid:DDBF9C9C-EA7C-42D7-B5F8-A2F0EFD3A6BA@apple.com"
type="cite" class="">
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" class="">
<div class="">Vassil and Richard,</div>
<div class=""><br class="">
</div>
<div class="">After this commit, clang errors out when
compiling the following code, which used to compile
without any errors.</div>
<div class=""><br class="">
</div>
<div class="">
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">$ cat f2.cpp</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">extern int
compile_time_assert_failed[1]; </span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;
min-height: 13px;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""></span><br
class="">
</div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">template
<typename ></span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">class C {</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">enum { D };</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">public:</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">template
<typename A> void foo1() {</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""> extern int
compile_time_assert_failed[ ((int)C<A>::k
> (int)D) ? 1 : -1];</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">}</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">};</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;
min-height: 13px;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""></span><br
class="">
</div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">template<></span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">class C<int>
{</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">public:</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""> const static int
k = 2;</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">};</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;
min-height: 13px;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""></span><br
class="">
</div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">void foo2() {</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""> C<char> c;</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">
c.foo1<int>();</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class="">}</span></div>
</div>
<div class=""><span style="font-variant-ligatures:
no-common-ligatures" class=""><br class="">
</span></div>
<div class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">$ cat f3.cpp </span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">void foo1() {</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class=""> extern int
foo0[1];</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">}</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;
min-height: 13px;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""></span><br
class="">
</div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">template<int
n></span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">void foo2() {</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class=""> extern int
foo0[n ? 1 : -1];</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">}</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;
min-height: 13px;" class=""><span
style="font-variant-ligatures:
no-common-ligatures" class=""></span><br
class="">
</div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">void foo3() {</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">
foo2<5>();</span></div>
<div style="margin: 0px; font-size: 11px;
line-height: normal; font-family: Menlo;"
class=""><span style="font-variant-ligatures:
no-common-ligatures" class="">}</span></div>
<div class=""><span style="font-variant-ligatures:
no-common-ligatures" class=""><br class="">
</span></div>
</span></div>
<div class="">The code looks legal, so I don’t think
clang should complain?</div>
<div class=""><br class="">
</div>
<div class="">
<blockquote type="cite" class="">
<div class="">On Feb 28, 2016, at 11:08 AM, Vassil
Vassilev via cfe-commits <<a
moz-do-not-send="true"
href="mailto:cfe-commits@lists.llvm.org"
class="">cfe-commits@lists.llvm.org</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="">Author: vvassilev<br class="">
Date: Sun Feb 28 13:08:24 2016<br class="">
New Revision: 262189<br class="">
<br class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project?rev=262189&view=rev"
class="">http://llvm.org/viewvc/llvm-project?rev=262189&view=rev</a><br
class="">
Log:<br class="">
[modules] Prefer more complete array types.<br
class="">
<br class="">
If we import a module that has a complete
array type and one that has an<br class="">
incomplete array type, the declaration found
by name lookup might be the one with<br
class="">
the incomplete type, possibly resulting in
rejects-valid.<br class="">
<br class="">
Now, the name lookup prefers decls with a
complete array types. Also,<br class="">
diagnose cases when the redecl chain has array
bound, different from the merge<br class="">
candidate.<br class="">
<br class="">
Reviewed by Richard Smith.<br class="">
<br class="">
Modified:<br class="">
cfe/trunk/lib/Sema/SemaDecl.cpp<br class="">
cfe/trunk/lib/Sema/SemaLookup.cpp<br
class="">
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp<br class="">
cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp<br class="">
cfe/trunk/test/Modules/Inputs/PR26179/A.h<br
class="">
cfe/trunk/test/Modules/Inputs/PR26179/B.h<br
class="">
cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h<br class="">
<br class="">
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br
class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=262189&r1=262188&r2=262189&view=diff"
class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=262189&r1=262188&r2=262189&view=diff</a><br
class="">
==============================================================================<br
class="">
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br
class="">
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Sun Feb 28
13:08:24 2016<br class="">
@@ -3245,6 +3245,22 @@ void
Sema::mergeObjCMethodDecls(ObjCMeth<br
class="">
CheckObjCMethodOverride(newMethod,
oldMethod);<br class="">
}<br class="">
<br class="">
+static void diagnoseVarDeclTypeMismatch(Sema
&S, VarDecl *New, VarDecl* Old) {<br
class="">
+
assert(!S.Context.hasSameType(New->getType(),
Old->getType()));<br class="">
+<br class="">
+ S.Diag(New->getLocation(),
New->isThisDeclarationADefinition()<br
class="">
+ ?
diag::err_redefinition_different_type<br
class="">
+ :
diag::err_redeclaration_different_type)<br
class="">
+ << New->getDeclName() <<
New->getType() << Old->getType();<br
class="">
+<br class="">
+ diag::kind PrevDiag;<br class="">
+ SourceLocation OldLocation;<br class="">
+ std::tie(PrevDiag, OldLocation)<br class="">
+ = getNoteDiagForInvalidRedeclaration(Old,
New);<br class="">
+ S.Diag(OldLocation, PrevDiag);<br class="">
+ New->setInvalidDecl();<br class="">
+}<br class="">
+<br class="">
/// MergeVarDeclTypes - We parsed a variable
'New' which has the same name and<br class="">
/// scope as a previous declaration 'Old'.
Figure out how to merge their types,<br
class="">
/// emitting diagnostics as appropriate.<br
class="">
@@ -3271,21 +3287,40 @@ void
Sema::MergeVarDeclTypes(VarDecl *Ne<br
class="">
// object or function shall be
identical, except that declarations for an<br
class="">
// array object can specify array types
that differ by the presence or<br class="">
// absence of a major array bound
(8.3.4).<br class="">
- else if
(Old->getType()->isIncompleteArrayType()
&&<br class="">
-
New->getType()->isArrayType())
{<br class="">
- const ArrayType *OldArray =
Context.getAsArrayType(Old->getType());<br
class="">
- const ArrayType *NewArray =
Context.getAsArrayType(New->getType());<br
class="">
- if
(Context.hasSameType(OldArray->getElementType(),<br
class="">
-
NewArray->getElementType()))<br
class="">
- MergedT = New->getType();<br
class="">
- } else if
(Old->getType()->isArrayType()
&&<br class="">
-
New->getType()->isIncompleteArrayType())
{<br class="">
+ else if
(Old->getType()->isArrayType()
&&
New->getType()->isArrayType()) {<br
class="">
const ArrayType *OldArray =
Context.getAsArrayType(Old->getType());<br
class="">
const ArrayType *NewArray =
Context.getAsArrayType(New->getType());<br
class="">
- if
(Context.hasSameType(OldArray->getElementType(),<br
class="">
-
NewArray->getElementType()))<br
class="">
- MergedT = Old->getType();<br
class="">
- } else if
(New->getType()->isObjCObjectPointerType()
&&<br class="">
+<br class="">
+ // We are merging a variable
declaration New into Old. If it has an array<br
class="">
+ // bound, and that bound differs from
Old's bound, we should diagnose the<br
class="">
+ // mismatch.<br class="">
+ if
(!NewArray->isIncompleteArrayType()) {<br
class="">
+ for (VarDecl *PrevVD =
Old->getMostRecentDecl(); PrevVD;<br
class="">
+ PrevVD =
PrevVD->getPreviousDecl()) {<br class="">
+ const ArrayType *PrevVDTy =
Context.getAsArrayType(PrevVD->getType());<br
class="">
+ if
(PrevVDTy->isIncompleteArrayType())<br
class="">
+ continue;<br class="">
+<br class="">
+ if (!Context.hasSameType(NewArray,
PrevVDTy))<br class="">
+ return
diagnoseVarDeclTypeMismatch(*this, New,
PrevVD);<br class="">
+ }<br class="">
+ }<br class="">
+<br class="">
+ if
(OldArray->isIncompleteArrayType()
&& NewArray->isArrayType()) {<br
class="">
+ if
(Context.hasSameType(OldArray->getElementType(),<br
class="">
+
NewArray->getElementType()))<br
class="">
+ MergedT = New->getType();<br
class="">
+ }<br class="">
+ // FIXME: Check visibility. New is
hidden but has a complete type. If New<br
class="">
+ // has no array bound, it should not
inherit one from Old, if Old is not<br
class="">
+ // visible.<br class="">
+ else if (OldArray->isArrayType()
&&
NewArray->isIncompleteArrayType()) {<br
class="">
+ if
(Context.hasSameType(OldArray->getElementType(),<br
class="">
+
NewArray->getElementType()))<br
class="">
+ MergedT = Old->getType();<br
class="">
+ }<br class="">
+ }<br class="">
+ else if
(New->getType()->isObjCObjectPointerType()
&&<br class="">
Old->getType()->isObjCObjectPointerType()) {<br
class="">
MergedT =
Context.mergeObjCGCQualifiers(New->getType(),<br
class="">
Old->getType());<br
class="">
@@ -3311,27 +3346,7 @@ void
Sema::MergeVarDeclTypes(VarDecl *Ne<br
class="">
New->setType(Context.DependentTy);<br
class="">
return;<br class="">
}<br class="">
-<br class="">
- // FIXME: Even if this merging succeeds,
some other non-visible declaration<br class="">
- // of this variable might have an
incompatible type. For instance:<br class="">
- //<br class="">
- // extern int arr[];<br class="">
- // void f() { extern int arr[2]; }<br
class="">
- // void g() { extern int arr[3]; }<br
class="">
- //<br class="">
- // Neither C nor C++ requires a
diagnostic for this, but we should still try<br
class="">
- // to diagnose it.<br class="">
- Diag(New->getLocation(),
New->isThisDeclarationADefinition()<br
class="">
- ?
diag::err_redefinition_different_type<br
class="">
- :
diag::err_redeclaration_different_type)<br
class="">
- << New->getDeclName()
<< New->getType() <<
Old->getType();<br class="">
-<br class="">
- diag::kind PrevDiag;<br class="">
- SourceLocation OldLocation;<br class="">
- std::tie(PrevDiag, OldLocation) =<br
class="">
-
getNoteDiagForInvalidRedeclaration(Old,
New);<br class="">
- Diag(OldLocation, PrevDiag);<br class="">
- return New->setInvalidDecl();<br
class="">
+ return diagnoseVarDeclTypeMismatch(*this,
New, Old);<br class="">
}<br class="">
<br class="">
// Don't actually update the type on the new
declaration if the old<br class="">
<br class="">
Modified: cfe/trunk/lib/Sema/SemaLookup.cpp<br
class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=262189&r1=262188&r2=262189&view=diff"
class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=262189&r1=262188&r2=262189&view=diff</a><br
class="">
==============================================================================<br
class="">
--- cfe/trunk/lib/Sema/SemaLookup.cpp
(original)<br class="">
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Sun Feb
28 13:08:24 2016<br class="">
@@ -419,6 +419,18 @@ static bool
isPreferredLookupResult(Sema<br class="">
}<br class="">
}<br class="">
<br class="">
+ // VarDecl can have incomplete array types,
prefer the one with more complete<br class="">
+ // array type.<br class="">
+ if (VarDecl *DVD =
dyn_cast<VarDecl>(DUnderlying)) {<br
class="">
+ VarDecl *EVD =
cast<VarDecl>(EUnderlying);<br class="">
+ if
(EVD->getType()->isIncompleteType()
&&<br class="">
+
!DVD->getType()->isIncompleteType())
{<br class="">
+ // Prefer the decl with a more complete
type if visible.<br class="">
+ return S.isVisible(DVD);<br class="">
+ }<br class="">
+ return false; // Avoid picking up a newer
decl, just because it was newer.<br class="">
+ }<br class="">
+<br class="">
// For most kinds of declaration, it doesn't
really matter which one we pick.<br class="">
if (!isa<FunctionDecl>(DUnderlying)
&& !isa<VarDecl>(DUnderlying)) {<br
class="">
// If the existing declaration is hidden,
prefer the new one. Otherwise,<br class="">
<br class="">
Modified:
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp<br
class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=262189&r1=262188&r2=262189&view=diff"
class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=262189&r1=262188&r2=262189&view=diff</a><br
class="">
==============================================================================<br
class="">
---
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
(original)<br class="">
+++
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
Sun Feb 28 13:08:24 2016<br class="">
@@ -2613,7 +2613,7 @@ static bool
isSameEntity(NamedDecl *X, N<br class="">
// template <typename T> struct S
{ static T Var[]; }; // #1<br class="">
// template <typename T> T
S<T>::Var[sizeof(T)]; // #2<br class="">
// Only? happens when completing an
incomplete array type. In this case<br
class="">
- // when comparing #1 and #2 we should
go through their elements types.<br class="">
+ // when comparing #1 and #2 we should
go through their element type.<br class="">
const ArrayType *VarXTy =
C.getAsArrayType(VarX->getType());<br
class="">
const ArrayType *VarYTy =
C.getAsArrayType(VarY->getType());<br
class="">
if (!VarXTy || !VarYTy)<br class="">
<br class="">
Modified:
cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp<br
class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp?rev=262189&r1=262188&r2=262189&view=diff"
class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp?rev=262189&r1=262188&r2=262189&view=diff</a><br
class="">
==============================================================================<br
class="">
---
cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp
(original)<br class="">
+++
cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp
Sun Feb 28 13:08:24 2016<br class="">
@@ -207,3 +207,7 @@ namespace use_outside_ns {<br
class="">
int j() { return sizeof(d); }<br class="">
}<br class="">
}<br class="">
+<br class="">
+extern int arr[];<br class="">
+void f1() { extern int arr[2]; } //
expected-note {{previous}}<br class="">
+void f2() { extern int arr[3]; } //
expected-error {{different type: 'int [3]' vs
'int [2]'}}<br class="">
<br class="">
Modified:
cfe/trunk/test/Modules/Inputs/PR26179/A.h<br
class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/A.h?rev=262189&r1=262188&r2=262189&view=diff"
class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/A.h?rev=262189&r1=262188&r2=262189&view=diff</a><br
class="">
==============================================================================<br
class="">
--- cfe/trunk/test/Modules/Inputs/PR26179/A.h
(original)<br class="">
+++ cfe/trunk/test/Modules/Inputs/PR26179/A.h
Sun Feb 28 13:08:24 2016<br class="">
@@ -1,4 +1,2 @@<br class="">
#include "basic_string.h"<br class="">
#include "B.h"<br class="">
-<br class="">
-int *p = a;<br class="">
<br class="">
Modified:
cfe/trunk/test/Modules/Inputs/PR26179/B.h<br
class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/B.h?rev=262189&r1=262188&r2=262189&view=diff"
class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/B.h?rev=262189&r1=262188&r2=262189&view=diff</a><br
class="">
==============================================================================<br
class="">
--- cfe/trunk/test/Modules/Inputs/PR26179/B.h
(original)<br class="">
+++ cfe/trunk/test/Modules/Inputs/PR26179/B.h
Sun Feb 28 13:08:24 2016<br class="">
@@ -1,2 +1 @@<br class="">
#include "basic_string.h"<br class="">
-extern int a[5];<br class="">
<br class="">
Modified:
cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h<br
class="">
URL: <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h?rev=262189&r1=262188&r2=262189&view=diff"
class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h?rev=262189&r1=262188&r2=262189&view=diff</a><br
class="">
==============================================================================<br
class="">
---
cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h
(original)<br class="">
+++
cfe/trunk/test/Modules/Inputs/PR26179/basic_string.h
Sun Feb 28 13:08:24 2016<br class="">
@@ -9,6 +9,4 @@ struct basic_string {<br
class="">
template<typename T><br class="">
T
basic_string<T>::_S_empty_rep_storage[sizeof(T)];<br
class="">
<br class="">
-extern int a[];<br class="">
-<br class="">
#endif<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
cfe-commits mailing list<br class="">
<a moz-do-not-send="true"
href="mailto:cfe-commits@lists.llvm.org"
class="">cfe-commits@lists.llvm.org</a><br
class="">
<a moz-do-not-send="true"
class="moz-txt-link-freetext"
href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br
class="">
</div>
</div>
</blockquote>
</div>
<br class="">
</blockquote>
<p class=""><br class="">
</p>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</blockquote>
<p><br>
</p>
</body>
</html>