summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2018-02-13 19:53:40 +0000
committerRichard Trieu <rtrieu@google.com>2018-02-13 19:53:40 +0000
commit4d06bef38d404253266c2e42209f6d036b04f0cc (patch)
treedf84d19eb3e3229e3ed53240b2439b06118a60d9
parent2e2958497fdeeac97f1658b6d65e916ed950421e (diff)
downloadbcm5719-llvm-4d06bef38d404253266c2e42209f6d036b04f0cc.tar.gz
bcm5719-llvm-4d06bef38d404253266c2e42209f6d036b04f0cc.zip
Update StmtProfile.cpp to handle zero template arguments.
Treat having no templates arguments differently than having zero template arguments when profiling. llvm-svn: 325040
-rw-r--r--clang/lib/AST/StmtProfile.cpp7
-rw-r--r--clang/test/Modules/odr_hash.cpp15
2 files changed, 20 insertions, 2 deletions
diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index 00ef0da18bb..08261205ef0 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -966,8 +966,11 @@ void StmtProfiler::VisitDeclRefExpr(const DeclRefExpr *S) {
if (!Canonical)
VisitNestedNameSpecifier(S->getQualifier());
VisitDecl(S->getDecl());
- if (!Canonical)
- VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
+ if (!Canonical) {
+ ID.AddBoolean(S->hasExplicitTemplateArgs());
+ if (S->hasExplicitTemplateArgs())
+ VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
+ }
}
void StmtProfiler::VisitPredefinedExpr(const PredefinedExpr *S) {
diff --git a/clang/test/Modules/odr_hash.cpp b/clang/test/Modules/odr_hash.cpp
index 054e41a9eae..5991dd0a733 100644
--- a/clang/test/Modules/odr_hash.cpp
+++ b/clang/test/Modules/odr_hash.cpp
@@ -2924,6 +2924,21 @@ int I10 = F10();
// expected-note@first.h:* {{but in 'FirstModule' found a different body}}
} // namespace FunctionDecl
+namespace DeclTemplateArguments {
+#if defined(FIRST)
+int foo() { return 1; }
+int bar() { return foo(); }
+#elif defined(SECOND)
+template <class T = int>
+int foo() { return 2; }
+int bar() { return foo<>(); }
+#else
+int num = bar();
+// expected-error@second.h:* {{'DeclTemplateArguments::bar' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
+// expected-note@first.h:* {{but in 'FirstModule' found a different body}}
+#endif
+}
+
// Keep macros contained to one file.
#ifdef FIRST
#undef FIRST
OpenPOWER on IntegriCloud