aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2012-07-27 01:15:02 +0000
committerJordan Rose <jordan_rose@apple.com>2012-07-27 01:15:02 +0000
commit69a0e5021c5c49a34aa25cd89b1e613a52097e65 (patch)
treeb829e37d1c2eda34c0a8fdb9dfb8b2d27339bb22 /test
parent979f098cfa808cc9236b39658cc3757a39dfa459 (diff)
[analyzer] Look through SubstNonTypeTemplateParmExprs.
We were treating this like a CXXDefaultArgExpr, but SubstNonTypeTemplateParmExpr actually appears when a template is instantiated, i.e. we have all the information necessary to evaluate it. This allows us to inline functions like llvm::array_lengthof. <rdar://problem/11949235> git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160846 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Analysis/templates.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/test/Analysis/templates.cpp b/test/Analysis/templates.cpp
index 6add18c190..671aa78582 100644
--- a/test/Analysis/templates.cpp
+++ b/test/Analysis/templates.cpp
@@ -1,4 +1,6 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core -fblocks -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -verify %s
+
+void clang_analyzer_eval(bool);
// Do not crash on this templated code which uses a block.
typedef void (^my_block)(void);
@@ -27,3 +29,16 @@ int main(){
Mf m;
m.I();
}
+
+
+// <rdar://problem/11949235>
+template<class T, unsigned N>
+inline unsigned array_lengthof(T (&)[N]) {
+ return N;
+}
+
+void testNonTypeTemplateInstantiation() {
+ const char *S[] = { "a", "b" };
+ clang_analyzer_eval(array_lengthof(S) == 2); // expected-warning{{TRUE}}
+}
+