a1f8ad145e
applied to our copy of llvm/clang. These can be applied in alphabetical order to a pristine llvm/clang 3.4 release source tree, to result in the same version used in FreeBSD. This is intended to clearly document all the changes until now, which mostly consist of cherry pickings from the respective upstream trunks, plus a number of hand-written FreeBSD-specific ones. Hopefully those can eventually be cleaned up and sent upstream too. MFC after: 1 week X-MFC-With: r263313
64 lines
2.0 KiB
Diff
64 lines
2.0 KiB
Diff
Pull in r200899 from upstream clang trunk (by Serge Pavlov):
|
|
|
|
Allow transformation of VariableArray to ConstantArray.
|
|
|
|
In the following code:
|
|
|
|
struct A { static const int sz; };
|
|
template<class T> void f() { T arr[A::sz]; }
|
|
|
|
the array 'arr' is represented as a variable size array in the template.
|
|
If 'A::sz' gets value below in the translation unit, the array in
|
|
instantiation can turn into constant size array.
|
|
|
|
This change fixes PR18633.
|
|
|
|
Differential Revision: http://llvm-reviews.chandlerc.com/D2688
|
|
|
|
Introduced here: http://svn.freebsd.org/changeset/base/261680
|
|
|
|
Index: tools/clang/test/SemaCXX/c99-variable-length-array.cpp
|
|
===================================================================
|
|
--- tools/clang/test/SemaCXX/c99-variable-length-array.cpp
|
|
+++ tools/clang/test/SemaCXX/c99-variable-length-array.cpp
|
|
@@ -140,3 +140,24 @@ namespace PR11744 {
|
|
}
|
|
int test = f<int>(0); // expected-note {{instantiation of}}
|
|
}
|
|
+
|
|
+namespace pr18633 {
|
|
+ struct A1 {
|
|
+ static const int sz;
|
|
+ static const int sz2;
|
|
+ };
|
|
+ const int A1::sz2 = 11;
|
|
+ template<typename T>
|
|
+ void func () {
|
|
+ int arr[A1::sz]; // expected-warning{{variable length arrays are a C99 feature}}
|
|
+ }
|
|
+ template<typename T>
|
|
+ void func2 () {
|
|
+ int arr[A1::sz2];
|
|
+ }
|
|
+ const int A1::sz = 12;
|
|
+ void func2() {
|
|
+ func<int>();
|
|
+ func2<int>();
|
|
+ }
|
|
+}
|
|
Index: tools/clang/lib/Sema/TreeTransform.h
|
|
===================================================================
|
|
--- tools/clang/lib/Sema/TreeTransform.h
|
|
+++ tools/clang/lib/Sema/TreeTransform.h
|
|
@@ -3966,7 +3966,9 @@ TreeTransform<Derived>::TransformVariableArrayType
|
|
return QualType();
|
|
}
|
|
|
|
- VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
|
|
+ // We might have constant size array now, but fortunately it has the same
|
|
+ // location layout.
|
|
+ ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
|
|
NewTL.setLBracketLoc(TL.getLBracketLoc());
|
|
NewTL.setRBracketLoc(TL.getRBracketLoc());
|
|
NewTL.setSizeExpr(Size);
|