placed in a particular register. */
if (VAR_P (decl) && DECL_REGISTER (decl))
{
- set_user_assembler_name (decl, asmspec);
- DECL_HARD_REGISTER (decl) = 1;
+ if (TREE_ADDRESSABLE (decl))
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "address of explicit register variable %qD requested",
+ decl);
+ else
+ {
+ set_user_assembler_name (decl, asmspec);
+ DECL_HARD_REGISTER (decl) = 1;
+ }
}
else
{
if (VAR_P (decl) && DECL_REGISTER (decl) && asmspec)
{
- set_user_assembler_name (decl, asmspec);
- DECL_HARD_REGISTER (decl) = 1;
+ if (TREE_ADDRESSABLE (decl))
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "address of explicit register variable %qD requested",
+ decl);
+ else
+ {
+ set_user_assembler_name (decl, asmspec);
+ DECL_HARD_REGISTER (decl) = 1;
+ }
}
return;
}
--- /dev/null
+// PR c++/122860
+// { dg-do compile }
+// { dg-options "-Wno-register" }
+
+void
+foo ()
+{
+ register __UINTPTR_TYPE__ val asm ("1") = (__UINTPTR_TYPE__) &val; // { dg-error "address of explicit register variable 'val' requested" }
+}
+
+template <typename T>
+void
+bar ()
+{
+ register T val asm ("1") = (T) &val; // { dg-error "address of explicit register variable 'val' requested" }
+}
+
+template <typename T>
+void
+baz ()
+{
+ register __UINTPTR_TYPE__ val asm ("1") = (__UINTPTR_TYPE__) &val; // { dg-error "address of explicit register variable 'val' requested" }
+}
+
+void
+qux ()
+{
+ bar <__UINTPTR_TYPE__> ();
+ baz <int> ();
+}