summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r261680-clang-r200899-fix-security-quantis.diff
blob: 50478ba6b8293071e2ef112804eb4f33de3da589 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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://svnweb.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);
OpenPOWER on IntegriCloud