Mark as referenced the functions from instantiated UserDefinedLiterals.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 9 Apr 2013 01:17:02 +0000 (01:17 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 9 Apr 2013 01:17:02 +0000 (01:17 +0000)
Fixes rdar://13589856

llvm-svn: 179078

clang/lib/Sema/TreeTransform.h
clang/test/SemaCXX/cxx11-user-defined-literals-unused.cpp [new file with mode: 0644]

index f68de26..8356095 100644 (file)
@@ -6173,6 +6173,8 @@ TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
 template<typename Derived>
 ExprResult
 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
+  if (FunctionDecl *FD = E->getDirectCallee())
+    SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
   return SemaRef.MaybeBindToTemporary(E);
 }
 
diff --git a/clang/test/SemaCXX/cxx11-user-defined-literals-unused.cpp b/clang/test/SemaCXX/cxx11-user-defined-literals-unused.cpp
new file mode 100644 (file)
index 0000000..cd93ffb
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -std=c++11 -verify %s -Wunused
+
+namespace {
+double operator"" _x(long double value) { return double(value); }
+int operator"" _ii(long double value) { return int(value); } // expected-warning {{not needed and will not be emitted}}
+}
+
+namespace rdar13589856 {
+  template<class T> double value() { return 3.2_x; }
+  template<class T> int valuei() { return 3.2_ii; }
+
+  double get_value() { return value<double>(); }
+}