[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-14 Thread Balázs Benics via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
steakhal marked an inline comment as done.
Closed by commit rG163863604f9c: [analyzer] Evaluate PredefinedExpressions 
(authored by steakhal).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

Files:
  clang/lib/StaticAnalyzer/Core/Environment.cpp
  clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
  clang/test/Analysis/eval-predefined-exprs.cpp

Index: clang/test/Analysis/eval-predefined-exprs.cpp
===
--- /dev/null
+++ clang/test/Analysis/eval-predefined-exprs.cpp
@@ -0,0 +1,109 @@
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
+//
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify \
+// RUN:   -triple i386-pc-win32 -fms-compatibility -fms-extensions -DANALYZER_MS %s
+
+template 
+void clang_analyzer_dump(const T *);
+void clang_analyzer_warnIfReached();
+
+void builtin_unique_stable_name_of_lambda() {
+  auto y = [] {};
+  clang_analyzer_dump(__builtin_unique_stable_name(y));
+  // expected-warning@-1 {{{"_ZTSZ36builtin_unique_stable_name_of_lambdavEUlvE11_12",0 S64b,char}}}
+}
+
+template 
+void func(U param) {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
+  // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,wchar_t}}}
+#endif
+}
+
+void foo() {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"void foo()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"?foo@@YAXXZ",0 S64b,char}}}
+  // expected-warning@-4 {{{L"foo",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl foo(void)",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
+#endif
+
+  func('b'); // instantiate template
+}
+
+void test_builtin_unique_stable_name(int a) {
+  clang_analyzer_dump(__builtin_unique_stable_name(a));
+  // expected-warning@-1 {{{"_ZTSi",0 S64b,char}}}
+}
+
+struct A {
+  A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??0A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+  ~A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::~A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??1A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"~A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::~A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+
+  template  int dependent() {
+// We should not analyze dependent functions.
+// Such functions have no function name of predefined expressions such as: '__func__' etc.
+clang_analyzer_warnIfReached(); // no-warning
+  }
+};
Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp

[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Valeriy Savchenko via Phabricator via cfe-commits
vsavchenko accepted this revision.
vsavchenko added a comment.
This revision is now accepted and ready to land.

Thanks!
Great job!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Balázs Benics via Phabricator via cfe-commits
steakhal marked an inline comment as done.
steakhal added a comment.

Thank you all for the comments!




Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:101
+// Such functions have no function name of predefined expressions such as: 
'__func__' etc.
+clang_analyzer_warnIfReached();
+  }

vsavchenko wrote:
> Also can you please add `// no-warning` as a matter of conventions?
Sure, thanks.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Balázs Benics via Phabricator via cfe-commits
steakhal updated this revision to Diff 289446.
steakhal added a comment.

- Added `no-warning`.
- Added test-case for `__builtin_unique_stable_name` as well.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

Files:
  clang/lib/StaticAnalyzer/Core/Environment.cpp
  clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
  clang/test/Analysis/eval-predefined-exprs.cpp

Index: clang/test/Analysis/eval-predefined-exprs.cpp
===
--- /dev/null
+++ clang/test/Analysis/eval-predefined-exprs.cpp
@@ -0,0 +1,109 @@
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
+//
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify \
+// RUN:   -triple i386-pc-win32 -fms-compatibility -fms-extensions -DANALYZER_MS %s
+
+template 
+void clang_analyzer_dump(const T *);
+void clang_analyzer_warnIfReached();
+
+void builtin_unique_stable_name_of_lambda() {
+  auto y = [] {};
+  clang_analyzer_dump(__builtin_unique_stable_name(y));
+  // expected-warning@-1 {{{"_ZTSZ36builtin_unique_stable_name_of_lambdavEUlvE11_12",0 S64b,char}}}
+}
+
+template 
+void func(U param) {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
+  // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,wchar_t}}}
+#endif
+}
+
+void foo() {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"void foo()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"?foo@@YAXXZ",0 S64b,char}}}
+  // expected-warning@-4 {{{L"foo",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl foo(void)",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
+#endif
+
+  func('b'); // instantiate template
+}
+
+void test_builtin_unique_stable_name(int a) {
+  clang_analyzer_dump(__builtin_unique_stable_name(a));
+  // expected-warning@-1 {{{"_ZTSi",0 S64b,char}}}
+}
+
+struct A {
+  A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??0A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+  ~A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::~A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??1A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"~A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::~A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+
+  template  int dependent() {
+// We should not analyze dependent functions.
+// Such functions have no function name of predefined expressions such as: '__func__' etc.
+clang_analyzer_warnIfReached(); // no-warning
+  }
+};
Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
===
--- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
+++ 

[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added inline comments.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:7-21
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}

steakhal wrote:
> riccibruno wrote:
> > martong wrote:
> > > martong wrote:
> > > > steakhal wrote:
> > > > > Szelethus wrote:
> > > > > > Why not put the expected warning right below the function call?
> > > > > That would seriously violate the column limit.
> > > > > This way it is easier to see and validate the pattern IMO.
> > > > This could be like:
> > > > ```
> > > > clang_analyzer_dump(__FUNCDNAME__); // \
> > > > // expected-warning@-4 
> > > > {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
> > > > clang_analyzer_dump(L__FUNCTION__); // \
> > > > // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
> > > > ...
> > > > ```
> > > > So, this way you can keep the line limit, I think this is what 
> > > > @Szelethus refers to.
> > > > This could be like: ...
> > > There is no need for the `@-4` of course with that approach.
> > There is no column limit in `test/`.
> Do you think it would be more readable that way? I'm still not convinced.
I have no opinion on whether it is more readable. I was just saying that 
`test/` is an exception to the column limit policy, and indeed that *many* 
tests have lines longer that the limit.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Valeriy Savchenko via Phabricator via cfe-commits
vsavchenko added inline comments.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:101
+// Such functions have no function name of predefined expressions such as: 
'__func__' etc.
+clang_analyzer_warnIfReached();
+  }

Also can you please add `// no-warning` as a matter of conventions?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Valeriy Savchenko via Phabricator via cfe-commits
vsavchenko added a comment.

Awesome!
Can we cover `__builtin_unique_stable_name` as well?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Balázs Benics via Phabricator via cfe-commits
steakhal updated this revision to Diff 289432.
steakhal marked 2 inline comments as done.
steakhal added a comment.

We only analyze instantiated functions, which are not //dependently typed//.
Safe to assume that every encountered `PredefinedExpression` has a defined 
(non-null) function name.

Just to be sure I added a `clang_analyzer_warnIfReached` in a test-case.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

Files:
  clang/lib/StaticAnalyzer/Core/Environment.cpp
  clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
  clang/test/Analysis/eval-predefined-exprs.cpp

Index: clang/test/Analysis/eval-predefined-exprs.cpp
===
--- /dev/null
+++ clang/test/Analysis/eval-predefined-exprs.cpp
@@ -0,0 +1,103 @@
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
+//
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify \
+// RUN:   -triple i386-pc-win32 -fms-compatibility -fms-extensions -DANALYZER_MS %s
+
+template 
+void clang_analyzer_dump(const T *);
+void clang_analyzer_warnIfReached();
+
+template 
+void func(U param) {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
+  // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,wchar_t}}}
+#endif
+}
+
+void foo() {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"void foo()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"?foo@@YAXXZ",0 S64b,char}}}
+  // expected-warning@-4 {{{L"foo",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl foo(void)",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
+#endif
+
+  func('b'); // instantiate template
+}
+
+void test_builtin_unique_stable_name(int a) {
+  clang_analyzer_dump(__builtin_unique_stable_name(a));
+  // expected-warning@-1 {{{"_ZTSi",0 S64b,char}}}
+}
+
+struct A {
+  A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??0A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+  ~A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::~A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??1A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"~A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::~A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+
+  template  int dependent() {
+// We should not analyze dependent functions.
+// Such functions have no function name of predefined expressions such as: '__func__' etc.
+clang_analyzer_warnIfReached();
+  }
+};
Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
===
--- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
+++ clang/lib/StaticAnalyzer/Core/SValBuilder.cpp

[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Balázs Benics via Phabricator via cfe-commits
steakhal added inline comments.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:7-21
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}

riccibruno wrote:
> martong wrote:
> > martong wrote:
> > > steakhal wrote:
> > > > Szelethus wrote:
> > > > > Why not put the expected warning right below the function call?
> > > > That would seriously violate the column limit.
> > > > This way it is easier to see and validate the pattern IMO.
> > > This could be like:
> > > ```
> > > clang_analyzer_dump(__FUNCDNAME__); // \
> > > // expected-warning@-4 
> > > {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
> > > clang_analyzer_dump(L__FUNCTION__); // \
> > > // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
> > > ...
> > > ```
> > > So, this way you can keep the line limit, I think this is what @Szelethus 
> > > refers to.
> > > This could be like: ...
> > There is no need for the `@-4` of course with that approach.
> There is no column limit in `test/`.
Do you think it would be more readable that way? I'm still not convinced.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added inline comments.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:7-21
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}

martong wrote:
> martong wrote:
> > steakhal wrote:
> > > Szelethus wrote:
> > > > Why not put the expected warning right below the function call?
> > > That would seriously violate the column limit.
> > > This way it is easier to see and validate the pattern IMO.
> > This could be like:
> > ```
> > clang_analyzer_dump(__FUNCDNAME__); // \
> > // expected-warning@-4 
> > {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
> > clang_analyzer_dump(L__FUNCTION__); // \
> > // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
> > ...
> > ```
> > So, this way you can keep the line limit, I think this is what @Szelethus 
> > refers to.
> > This could be like: ...
> There is no need for the `@-4` of course with that approach.
There is no column limit in `test/`.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added a comment.

> I don't know how could a `PredefinedExpression` lack the function name, 
> probably @riccibruno or @rjmccall can help with this - according to D53605 
> .

A `PredefinedExpr` whose declaration context is dependent has no name (see 
`Sema::BuildPredefinedExpr`). Example:

  void f0() { __func__; }
  -PredefinedExpr 0x6a76ba8  'const char [3]' lvalue __func__
  `-StringLiteral 0x6a76b88  'const char [3]' lvalue "f0"
  
  template  void f1() { __func__; }
  `-PredefinedExpr 0x6a76e78  '' lvalue __func__
  
  template void f1();
  -PredefinedExpr 0x6a77060  'const char [3]' lvalue __func__
  `-StringLiteral 0x6a77040  'const char [3]' lvalue "f1"


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Gabor Marton via Phabricator via cfe-commits
martong added inline comments.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:7-21
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}

martong wrote:
> steakhal wrote:
> > Szelethus wrote:
> > > Why not put the expected warning right below the function call?
> > That would seriously violate the column limit.
> > This way it is easier to see and validate the pattern IMO.
> This could be like:
> ```
> clang_analyzer_dump(__FUNCDNAME__); // \
> // expected-warning@-4 
> {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
> clang_analyzer_dump(L__FUNCTION__); // \
> // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
> ...
> ```
> So, this way you can keep the line limit, I think this is what @Szelethus 
> refers to.
> This could be like: ...
There is no need for the `@-4` of course with that approach.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Gabor Marton via Phabricator via cfe-commits
martong added inline comments.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:7-21
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}

steakhal wrote:
> Szelethus wrote:
> > Why not put the expected warning right below the function call?
> That would seriously violate the column limit.
> This way it is easier to see and validate the pattern IMO.
This could be like:
```
clang_analyzer_dump(__FUNCDNAME__); // \
// expected-warning@-4 
{{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
clang_analyzer_dump(L__FUNCTION__); // \
// expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
...
```
So, this way you can keep the line limit, I think this is what @Szelethus 
refers to.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Balázs Benics via Phabricator via cfe-commits
steakhal marked 2 inline comments as done.
steakhal added inline comments.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:1
+// RUN: %clang_analyze_cc1 --std=c++17 
-analyzer-checker=core,debug.ExprInspection -verify %s
+

Szelethus wrote:
> Isn't it `-std=c++17`?
Thanks, typo.



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:7-21
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}

Szelethus wrote:
> Why not put the expected warning right below the function call?
That would seriously violate the column limit.
This way it is easier to see and validate the pattern IMO.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Balázs Benics via Phabricator via cfe-commits
steakhal updated this revision to Diff 289395.
steakhal added subscribers: riccibruno, rjmccall.
steakhal added a comment.

- Added tests for Microsoft extensions.
- Added an `assert` requiring the `PredefinedExpression` to have a function 
name.



I don't know how could a `PredefinedExpression` lack the function name, 
probably @riccibruno or @rjmccall can help with this - according to D53605 
.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

Files:
  clang/lib/StaticAnalyzer/Core/Environment.cpp
  clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
  clang/test/Analysis/eval-predefined-exprs.cpp

Index: clang/test/Analysis/eval-predefined-exprs.cpp
===
--- /dev/null
+++ clang/test/Analysis/eval-predefined-exprs.cpp
@@ -0,0 +1,96 @@
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
+//
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify \
+// RUN:   -triple i386-pc-win32 -fms-compatibility -fms-extensions -DANALYZER_MS %s
+
+template 
+void clang_analyzer_dump(const T *);
+
+template 
+void func(U param) {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
+  // expected-warning@-4 {{{L"func",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,wchar_t}}}
+#endif
+}
+
+void foo() {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"void foo()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+  clang_analyzer_dump(__FUNCDNAME__);
+  clang_analyzer_dump(L__FUNCTION__);
+  clang_analyzer_dump(__FUNCSIG__);
+  clang_analyzer_dump(L__FUNCSIG__);
+  // expected-warning@-4 {{{"?foo@@YAXXZ",0 S64b,char}}}
+  // expected-warning@-4 {{{L"foo",0 S64b,wchar_t}}}
+  // expected-warning@-4 {{{"void __cdecl foo(void)",0 S64b,char}}}
+  // expected-warning@-4 {{{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
+#endif
+
+  func('b'); // instantiate template
+}
+
+void test_builtin_unique_stable_name(int a) {
+  clang_analyzer_dump(__builtin_unique_stable_name(a));
+  // expected-warning@-1 {{{"_ZTSi",0 S64b,char}}}
+}
+
+struct A {
+  A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??0A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+  ~A() {
+clang_analyzer_dump(__func__);
+clang_analyzer_dump(__FUNCTION__);
+clang_analyzer_dump(__PRETTY_FUNCTION__);
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"~A",0 S64b,char}}}
+// expected-warning@-3 {{{"A::~A()",0 S64b,char}}}
+
+#ifdef ANALYZER_MS
+clang_analyzer_dump(__FUNCDNAME__);
+clang_analyzer_dump(L__FUNCTION__);
+clang_analyzer_dump(__FUNCSIG__);
+clang_analyzer_dump(L__FUNCSIG__);
+// expected-warning@-4 {{{"??1A@@QAE@XZ",0 S64b,char}}}
+// expected-warning@-4 {{{L"~A",0 S64b,wchar_t}}}
+// expected-warning@-4 {{{"__thiscall A::~A(void)",0 S64b,char}}}
+// expected-warning@-4 {{{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
+#endif
+  }
+};
Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
===
--- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
+++ clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
@@ -306,6 +306,13 @@
 return makeLoc(getRegionManager().getStringRegion(SL));
   }
 
+  case Stmt::PredefinedExprClass: {
+const auto *PE = cast(E);
+assert(PE->getFunctionName() &&

[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Valeriy Savchenko via Phabricator via cfe-commits
vsavchenko requested changes to this revision.
vsavchenko added inline comments.
This revision now requires changes to proceed.



Comment at: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp:311
+const auto *PE = cast(E);
+return makeLoc(getRegionManager().getStringRegion(PE->getFunctionName()));
+  }

I'm not super familiar with predefined expressions, but it looks like it this 
commit doesn't cover all kinds of those.  And for some this can return 
`nullptr`.

Can you, please, add tests for other kinds as well?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Kristóf Umann via Phabricator via cfe-commits
Szelethus accepted this revision.
Szelethus added a comment.
This revision is now accepted and ready to land.

LGTM! Nice!




Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:1
+// RUN: %clang_analyze_cc1 --std=c++17 
-analyzer-checker=core,debug.ExprInspection -verify %s
+

Isn't it `-std=c++17`?



Comment at: clang/test/Analysis/eval-predefined-exprs.cpp:7-21
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}

Why not put the expected warning right below the function call?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87004/new/

https://reviews.llvm.org/D87004

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87004: [analyzer] Evaluate PredefinedExpressions

2020-09-02 Thread Balázs Benics via Phabricator via cfe-commits
steakhal created this revision.
steakhal added reviewers: NoQ, Szelethus, vsavchenko, xazax.hun.
Herald added subscribers: cfe-commits, ASDenysPetrov, martong, Charusso, 
dkrupp, donat.nagy, mikhail.ramalho, a.sidorin, rnkovacs, szepet, 
baloghadamsoftware, whisperity.
Herald added a project: clang.
steakhal requested review of this revision.

We did not evaluate such expressions, just returned `unknown` for such cases.
After this patch, we will be able to access a unique value identifying a 
template instantiation.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D87004

Files:
  clang/lib/StaticAnalyzer/Core/Environment.cpp
  clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
  clang/test/Analysis/eval-predefined-exprs.cpp


Index: clang/test/Analysis/eval-predefined-exprs.cpp
===
--- /dev/null
+++ clang/test/Analysis/eval-predefined-exprs.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_analyze_cc1 --std=c++17 
-analyzer-checker=core,debug.ExprInspection -verify %s
+
+void clang_analyzer_dump(const char *);
+
+template 
+void func(U param) {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = 
char]",0 S64b,char}}}
+}
+
+void foo() {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"void foo()",0 S64b,char}}}
+
+  func('b'); // instantiate template
+}
Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
===
--- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
+++ clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
@@ -306,6 +306,11 @@
 return makeLoc(getRegionManager().getStringRegion(SL));
   }
 
+  case Stmt::PredefinedExprClass: {
+const auto *PE = cast(E);
+return makeLoc(getRegionManager().getStringRegion(PE->getFunctionName()));
+  }
+
   // Fast-path some expressions to avoid the overhead of going through the 
AST's
   // constant evaluator
   case Stmt::CharacterLiteralClass: {
Index: clang/lib/StaticAnalyzer/Core/Environment.cpp
===
--- clang/lib/StaticAnalyzer/Core/Environment.cpp
+++ clang/lib/StaticAnalyzer/Core/Environment.cpp
@@ -109,6 +109,7 @@
   case Stmt::StringLiteralClass:
   case Stmt::TypeTraitExprClass:
   case Stmt::SizeOfPackExprClass:
+  case Stmt::PredefinedExprClass:
 // Known constants; defer to SValBuilder.
 return svalBuilder.getConstantVal(cast(S)).getValue();
 


Index: clang/test/Analysis/eval-predefined-exprs.cpp
===
--- /dev/null
+++ clang/test/Analysis/eval-predefined-exprs.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_analyze_cc1 --std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
+
+void clang_analyzer_dump(const char *);
+
+template 
+void func(U param) {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"func",0 S64b,char}}}
+  // expected-warning@-3 {{{"void func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
+}
+
+void foo() {
+  clang_analyzer_dump(__func__);
+  clang_analyzer_dump(__FUNCTION__);
+  clang_analyzer_dump(__PRETTY_FUNCTION__);
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"foo",0 S64b,char}}}
+  // expected-warning@-3 {{{"void foo()",0 S64b,char}}}
+
+  func('b'); // instantiate template
+}
Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
===
--- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
+++ clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
@@ -306,6 +306,11 @@
 return makeLoc(getRegionManager().getStringRegion(SL));
   }
 
+  case Stmt::PredefinedExprClass: {
+const auto *PE = cast(E);
+return makeLoc(getRegionManager().getStringRegion(PE->getFunctionName()));
+  }
+
   // Fast-path some expressions to avoid the overhead of going through the AST's
   // constant evaluator
   case Stmt::CharacterLiteralClass: {
Index: clang/lib/StaticAnalyzer/Core/Environment.cpp
===
--- clang/lib/StaticAnalyzer/Core/Environment.cpp
+++ clang/lib/StaticAnalyzer/Core/Environment.cpp
@@ -109,6 +109,7 @@
   case Stmt::StringLiteralClass:
   case Stmt::TypeTraitExprClass:
   case Stmt::SizeOfPackExprClass:
+  case Stmt::PredefinedExprClass:
 // Known constants; defer to SValBuilder.
 return svalBuilder.getConstantVal(cast(S)).getValue();